通过 SSH 会话变量

通过 SSH 会话变量

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 转发:本地变量LANGLC_*(加上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 …'

相关内容