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