mount.cifs 可以使用变量 PASSWD 进行密码验证。
好吧,下面的例子说明了问题:
export PASSWD=mysecret; ssh foreignhost "echo $PASSWD"
有效,这意味着将显示环境变量 PASSWD 的值。出色地,
export PASSWD=mysecret; ssh foreignhost "mount -t cifs //server/path /mnt -o username=myuser"
要求输入密码,但是
export PASSWD=mysecret; ssh foreignhost "PASSWD=$PASSWD mount -t cifs //server/path /mnt -o username=myuser"
不要求输入密码,而是使用 PASSWD 的值进行身份验证。但为什么?安全问题在于,密码将以明文形式显示在进程列表中。
这会在您的本地 shell 中设置 shell 变量
PASSWD
(以及在您的本地 shell 启动的子进程的环境中)。然后在echo mysecret
上执行命令foreignhost
。在"echo $PASSWD"
中,本地 shell 对双引号之间的文本执行变量扩展。密码字符串出现在远程 shell 的命令行中,因此它在进程列表中可见。这会在您的本地 shell 中设置 shell 变量
PASSWD
(以及由您的本地 shell 启动的子进程的环境,包括ssh
客户端进程。根据客户端和服务器的配置,SSH 客户端可能会将某些环境变量传输到服务器,并且服务器可能接受也可能不接受它们。通常,只有少数列入白名单的环境变量通过 SSH 转发:局部变量LANG
和LC_*
(加上TERM
得到特殊处理的变量)。除非您(或您的发行版)已将 SSH 客户端配置为发送PASSWD
和SSH 服务器接受PASSWD
,远程 shell 没有PASSWD
设置环境变量。与第一种情况一样,远程 shell 命令具有密码 (
PASSWD=mysecret mount …
),因此它在进程列表中可见。许多发行版将 SSH 配置为发送和接受名称匹配的所有环境变量
LC_*
,因此您可以通过定义自己的方式转发数据。注意参数周围的单引号
ssh
。这样,在远程主机上执行的shell命令就是export PASSWD="$LC_ENV_PASSWD"; mount …
不带密码的shell命令。或者,在标准输入上传递密码。