如何让 SSH 从标准输入读取密码,默认情况下它不会这样做?
8 回答
根据这篇文章,您可以执行以下操作:
创建一个使用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 代表安全 shell,如果您将用户、主机和密码存储在纯文本文件中,您会误导该工具并造成可能的安全漏洞
您可以使用官方debian 存储库中的sshpass。例子:
$ apt-get install sshpass
$ sshpass -p 'password' ssh username@server
您不能使用大多数 SSH 客户端。您可以通过使用 SSH API 来解决它,例如用于 Python的Paramiko 。注意不要推翻所有安全策略。
提炼这个答案会留下一个简单而通用的脚本:
#!/bin/bash
[[ $1 =~ password: ]] && cat || SSH_ASKPASS="$0" DISPLAY=nothing:0 exec setsid "$@"
将其另存为pass
,执行 a chmod +x pass
,然后像这样使用它:
$ echo mypass | pass ssh user@host ...
如果它的第一个参数包含password:
,那么它将其输入传递给它的输出(cat
),否则它启动在将自己设置为SSH_ASKPASS
程序之后呈现的任何内容。
当ssh
同时遇到SSH_ASKPASS
ANDDISPLAY
设置时,它会启动由 引用的程序SSH_ASKPASS
,并传递给它提示user@host's password:
FreeBSD 邮件列表推荐了expect库。
如果您需要编程 ssh 登录,那么您确实应该使用公钥登录,但是 - 与使用外部库传递密码相比,这种方式的安全漏洞显然要少得多stdin
。
旧帖复活...
我在寻找完全相同的问题的解决方案时发现了这个,我发现了一些东西,我希望有一天有人会发现它有用:
- 安装ssh-askpass程序 (apt-get, yum ...)
- 设置
SSH_ASKPASS
变量 (export SSH_ASKPASS=/usr/bin/ssh-askpass
) - 从终端打开一个没有未定义的 TERMINAL 变量 (
setsid ssh user@host
)的新 ssh 连接
这看起来很简单,可以确保安全,但尚未检查(仅在本地安全上下文中使用)。
我们到了。
我不确定您需要此功能的原因,但您似乎可以使用 ssh-keygen 获得此行为。
它允许您通过在您的计算机上拥有私有 RSA 密钥和在服务器上拥有公共 RSA 密钥而无需使用密码登录到服务器。
更好的sshpass
选择是:
https ://github.com/clarkwang/passh
我遇到了问题sshpass
,如果 ssh 服务器未添加到我known_hosts
sshpass
将不会显示任何消息,passh
则没有此问题。