【发布时间】:2010-11-23 08:17:54
【问题描述】:
如何让 SSH 从标准输入读取密码,默认情况下不这样做?
【问题讨论】:
如何让 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 代表安全 shell,如果您将用户、主机和密码存储在纯文本文件中,您会误导该工具并造成可能的安全漏洞
【讨论】:
pass 获取密码,以通用方式提供给ssh-add,根据需要生成askpass 脚本。 milosophical.me/blog/2018/ssh-pass.html
您可以使用sshpass,例如官方的debian repositories。示例:
$ apt-get install sshpass
$ sshpass -p 'password' ssh username@server
【讨论】:
expect,我猜这比工作更麻烦。
您不能使用大多数 SSH 客户端。您可以通过使用 SSH API 来解决它,例如用于 Python 的 Paramiko。请注意不要推翻所有安全策略。
【讨论】:
蒸馏this answer 留下一个简单而通用的脚本:
#!/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:
【讨论】:
-oStrictHostKeyChecking=no 传递给 ssh 命令;否则会提示用户是否信任未知的主机密钥。显然,只有在您确定您信任未知的主机密钥时才这样做。
FreeBSD mailing list 推荐 expect 库。
如果您需要编程式 ssh 登录,您确实应该是 using public key logins,但是 - 显然,与使用外部库通过 stdin 传递密码相比,这种方式的安全漏洞要少得多。
【讨论】:
旧帖复活了……
我在寻找完全相同的问题的解决方案时发现了这个,我发现了一些东西,我希望有一天有人会发现它有用:
SSH_ASKPASS变量(export SSH_ASKPASS=/usr/bin/ssh-askpass)setsid ssh user@host)这看起来很简单,可以确保安全,但尚未检查(仅在本地安全上下文中使用)。
我们到了。
【讨论】:
我不确定您需要此功能的原因,但您似乎可以使用 ssh-keygen 获得此行为。
它允许您通过在您的计算机上拥有私有 RSA 密钥和在服务器上拥有公共 RSA 密钥而无需使用密码登录到服务器。
【讨论】:
更好的sshpass 替代方案是:
https://github.com/clarkwang/passh
我遇到了sshpass 的问题,如果 ssh 服务器没有添加到我的known_hosts sshpass 将不会显示任何消息,passh 没有这个问题。
【讨论】: