这取决于您使用的 shell 是echo
内置的,还是使用外部二进制文件 (/bin/echo)。如果它是外部二进制文件,它将作为子进程运行,密码在其参数列表中清晰可见(通过ps
、pgrep
等)。如果它是内置的,echo
管道中的命令将作为子进程运行,但它将是与父 shell 具有相同可见参数列表的子 shell(即它是安全的)。
所以它可能是安全的,但有几个并发症需要担心。首先,如果你在远程计算机上通过 运行它ssh
,你不一定知道它的默认 shell 是什么。如果是 bash,你就没事。如果是破折号,我认为你有问题。其次,您不必担心远程 shell 和/或echo
命令,您还必须担心从本地脚本到远程echo
命令的路径上的每一步。例如,如果您使用:
ssh user@computer "echo -e 'old\nnew\nnew' | passwd"
...那么远程echo
可能是安全的(取决于远程外壳),但正如@thatotherguy 指出的那样,密码将在远程外壳的(bash -c echo -e 'foo\nbar\nbar' | passwd
)和本地ssh
进程的参数列表中可见。
顺便说一句,还有另一个复杂之处:它在输出字符串中echo
处理选项(如 )和转义的方式不一致(请参阅此问题以获取示例)。你最好使用(例如),它也是 bash 的内置函数。或者,如果您确定您使用的是 bash,则可以使用 here-string ( ) 代替。它根本不解释转义,但您可以使用 bash 的构造来解释它们:-e
printf
printf '%s\n' "$oldpass" "$newpass" "$newpass"
<<<string
$' '
passwd <<<"$old"$'\n'"$new"$'\n'"$new"
这根本不涉及子进程(或者/bin/echo
子shell),所以不用担心进程表。
另一种避免不确定远程 shell 问题和出现在ssh
' 的参数列表中的密码的方法是通过ssh
' 的 stdin 传递密码:
ssh user@computer passwd <<<"$old"$'\n'"$new"$'\n'"$new"