如何让SSH读取标准输入中的密码,因为它默认情况下不会这样做?
根据这个post,你可以做以下操作:
创建一个命令,使用SSH_ASKPASS打开SSH会话(在man ssh中查找SSH_ASKPASS)
$ cat > ssh_session <<EOF
export SSH_ASKPASS="/path/to/script_returning_pass"
setsid ssh "your_user"@"your_host"
EOF
注意: 为了避免ssh尝试在tty上询问,我们使用setsid
创建一个脚本,返回你的密码(注意echo "echo)
$ echo "echo your_ssh_password" > /path/to/script_returning_pass
$ chmod +x ssh_session
$ chmod +x /path/to/script_returning_pass
试一试
$ ./ssh_session
请记住,ssh代表安全外壳协议,如果您将用户、主机和密码存储在纯文本文件中,那么您会误导该工具并创建可能的安全漏洞。
pass
获取口令,以一种通用的方式提供给ssh-add
,根据需要生成askpass脚本。https://milosophical.me/blog/2018/ssh-pass.html - mikeSSH_ASKPASS_REQUIRE
设置为force
,这样无论是否设置了DISPLAY
,都会始终调用$SSH_ASKPASS
。 - wto大多数SSH客户端无法做到这一点。您可以通过使用SSH API,例如Python的Paramiko来解决此问题。但请注意,不要重写所有安全策略。
这个答案的要点是一个简单通用的脚本:
#!/bin/bash
[[ $1 =~ password: ]] && cat || SSH_ASKPASS="$0" DISPLAY=nothing:0 exec setsid "$@"
将其保存为pass
,执行chmod +x pass
,然后按以下方式使用:
$ echo mypass | pass ssh user@host ...
password:
,则将其输入传递给其输出(cat
),否则它会启动在设置自身为SSH_ASKPASS
程序后呈现的任何内容。当ssh
遇到设置了SSH_ASKPASS
和DISPLAY
的情况时,它将启动SSH_ASKPASS
引用的程序,并将提示user@host 's password:
传递给它。ssh
命令中添加-oStrictHostKeyChecking=no
参数,否则它会提示用户是否信任未知的主机密钥。显然,只有在您确信信任未知的主机密钥时才这样做。 - villapxSSH_ASKPASS
变量(export SSH_ASKPASS=/usr/bin/ssh-askpass
)。
3. 从终端打开一个没有未定义TERMINAL变量的新ssh连接(setsid ssh user@host
)。FreeBSD邮件列表推荐使用expect库。
如果您需要程序化ssh登录,您真的应该使用公钥登录,然而——显然,这种方式比使用外部库通过stdin
传递密码要安全得多,因为存在更少的安全漏洞。