我完全同意所有说这几乎可以肯定是一个可怕的想法的人。极有可能让其他人攻击您的计算机。
在评估安全隐患后自行承担使用风险
回答
制作一个程序/path/to/saypass输出密码,如
#!/bin/sh
echo 'secret'
使其可执行
chmod +x /path/to/saypass
那么这是主要的命令:
SSH_ASKPASS="/path/to/saypass" DISPLAY=anything setsid ssh username@hostname [farcommand]
这个
- 设置两个环境变量
SSH_ASKPASS和DISPLAY
- 然后运行
setsid
- 然后在没有控制终端的情况下运行
ssh
- 连接到远端
hostname
- ...在本地运行
saypass获取密码
- ...告诉远端服务器
- ...并假设它是正确的
- 然后运行
farcommand(如果给定)或交互式 shell。
我通常使用date 或hostname 测试可选的farcommand。
这有很多地方出错。
说明
其中的诀窍是标准 Linux 命令行 ssh 有几个环境变量,您可以使用它们来选择一个程序,该程序将被执行以提供密码。
ssh(1) 手册页说:
SSH_ASKPASS 如果ssh 需要密码,如果它是从终端运行的,它将从当前终端读取密码。 如果ssh没有与之关联的终端,但设置了DISPLAY和SSH_ASKPASS,它将执行SSH_ASKPASS指定的程序并打开X11窗口读取密码。
所以:您需要一个可以输出密码的程序(shell 脚本或任何其他类型)。那你需要说服ssh使用它:
- 将
SSH_ASKPASS 设置为/path/to/saypass
-
DISPLAY 设置为一些愚蠢的东西
- 没有控制终端(这是
setsid 所做的)
您将它们放在以下sh 命令中:
SSH_ASKPASS="/path/to/saypass" DISPLAY=anything setsid ssh username@hostname [command]
ssh 将执行
/path/to/saypass "username@hostname's password:"
指纹检查
如果需要指纹,您通常会在哪里看到消息
The authenticity of host '*hostname* (*ipaddress*)' can't be established.
ECDSA key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no)?
然后ssh 会像这样运行你的命令:
/path/to/saypass "Please type 'yes' or 'no':"
一体化脚本
以下是用于在主脚本中创建、使用和删除saypass 的单个脚本。每个人都会告诉你不要将明文密码放在文件中,并且永远不要硬编码密码。他们告诉你这是有充分理由的:这会给你带来很多麻烦。使用风险自负。
#!/bin/sh
echo "#!/bin/sh\necho 'secret';rm -f /tmp/saypass.$$" > /tmp/saypass.$$
chmod 775 /tmp/saypass.$$
SSH_ASKPASS="/tmp/saypass.$$" DISPLAY=anything setsid ssh "$@"
SCP
这也适用于scp,ssh 之上的复制程序:
SSH_ASKPASS=/path/to/saypas DISPLAY=anything setsid scp username@hostname:/path/to/farfile .
警告
真的不要使用这个,除非在可怕、可怕的情况下,例如你有数百台计算机并且无法安装 ssh 密钥之类的东西,sshpass 甚至 expect。
如果您确实使用它,请不要告诉任何人我告诉过您如何使用它。实在是太可怕了。
我不知道手册页中关于“打开 X11 窗口”的含义,在我的测试中没有发生这种情况。
经过测试
- OpenSSH_6.6.1p1 Ubuntu-2ubuntu2,OpenSSL 1.0.1f 2014 年 1 月 6 日在 Ubuntu 14.04.1 LTS 上,
- OpenSSH_7.2p2 Ubuntu-4ubuntu2.1,OpenSSL 1.0.2g 2016 年 3 月 1 日在 Ubuntu 16.04.2 LTS 上
- OpenSSH_7.6p1 Ubuntu-4ubuntu0.3,OpenSSL 1.0.2n 2017 年 12 月 7 日在 Ubuntu 18.04.5 LTS 上