如何让SSH从标准input接收密码
你如何让SSH从标准input读取密码,默认情况下不会这样做?
你不能使用大多数SSH客户端。 你可以通过使用SSH API来解决这个问题,比如用于Python的Paramiko 。 小心不要推翻所有安全策略。
基于这个职位你可以这样做:
创build一个使用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
创build一个脚本,返回你的密码(注意回声“回声 )
$ echo "echo your_ssh_password" > /path/to/script_returning_pass
使他们可执行
$ chmod +x ssh_session $ chmod +x /path/to/script_returning_pass
尝试一下
$ ./ssh_session
请记住,ssh代表安全的shell,如果你存储你的用户,主机和密码在纯文本文件,你误导的工具创造一个可能的安全漏洞
你可以在官方的debian仓库中使用sshpass 。 例:
$ apt-get install sshpass $ sshpass -p 'password' ssh username@server
一个旧的职位复兴…
我find了这一个,同时寻找解决scheme完全相同的问题,我发现了一些东西,我希望有一天有人会发现它有用:
- 安装ssh-askpass程序(apt-get,yum …)
- 设置
SSH_ASKPASS
variables(export SSH_ASKPASS=/usr/bin/ssh-askpass
) - 从terminal打开一个新的SSH连接,没有一个未定义的TERMINALvariables(
setsid ssh user@host
)
这看起来很简单,很安全,但没有检查(只在本地安全的情况下使用)。
我们到了。
我不确定你需要这个function的原因,但似乎你可以用ssh-keygen得到这个行为。
它允许您在不使用密码的情况下通过在您的计算机上拥有专用RSA密钥和服务器上的公共RSA密钥来login到服务器。
FreeBSD邮件列表推荐了期望的库。
如果你需要一个编程式的sshlogin,你确实应该使用公共密钥login ,但是显然这样做比使用外部库通过stdin
传递密码要less很多。
提取这个答案留下一个简单而通用的脚本:
#!/bin/bash [[ $1 =~ password: ]] && cat || SSH_ASKPASS="$0" DISPLAY=nothing:0 exec setsid "$@"
把它保存为pass
,做一个chmod +x pass
,然后像这样使用它:
$ echo mypass | pass ssh user@host ...
如果它的第一个参数包含password:
那么它将它的input传递给它的输出( cat
),否则它会在将自己设置为SSH_ASKPASS
程序之后启动提交的SSH_ASKPASS
。
当ssh
遇到SSH_ASKPASS
和DISPLAY
集合时,它将启动由SSH_ASKPASS
引用的程序, SSH_ASKPASS
传递提示user@host's password: