如何让ssh从stdin接收密码
如何让SSH从stdin读取密码(默认情况下不会这样做?建议使用该库如何让ssh从stdin接收密码,ssh,passwords,stdin,Ssh,Passwords,Stdin,如何让SSH从stdin读取密码(默认情况下不会这样做?建议使用该库 但是,如果您需要编程式ssh登录,您确实应该这样做——显然,与使用外部库通过stdin传递密码相比,这种方式的安全漏洞要少得多。大多数ssh客户端都无法做到这一点。您可以使用sshapi来解决这个问题,就像Python一样。小心不要否决所有安全策略。旧的恢复后 我在寻找完全相同问题的解决方案时发现了这一点,我发现了一些东西,我希望有一天有人会发现它有用: 安装ssh-askpass程序(apt-get、yum…) 设置SSH\
但是,如果您需要编程式ssh登录,您确实应该这样做——显然,与使用外部库通过stdin传递密码相比,这种方式的安全漏洞要少得多。大多数ssh客户端都无法做到这一点。您可以使用sshapi来解决这个问题,就像Python一样。小心不要否决所有安全策略。旧的恢复后 我在寻找完全相同问题的解决方案时发现了这一点,我发现了一些东西,我希望有一天有人会发现它有用:
SSH\u ASKPASS
变量(export SSH\u ASKPASS=/usr/bin/SSH ASKPASS
)setsid ssh)的新ssh连接user@host
)$ chmod +x ssh_session
$ chmod +x /path/to/script_returning_pass
试试看
$ ./ssh_session
请记住,ssh代表secure shell,如果您将用户、主机和密码存储在纯文本文件中,则会误导该工具,从而造成可能的安全漏洞,例如在Official中。例如:
$ apt-get install sshpass
$ sshpass -p 'password' ssh username@server
我不确定您需要此功能的原因,但似乎您可以通过ssh-keygen获得此行为 它允许您在计算机上拥有一个专用RSA密钥,在服务器上拥有一个公用RSA密钥,从而无需使用密码即可登录到服务器 提取留下一个简单而通用的脚本:
#!/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\u ASKPASS
程序后启动显示的内容
当
ssh
同时遇到ssh\u ASKPASS
和DISPLAY
set时,它将启动ssh\u ASKPASS
引用的程序,并向其传递提示user@host的密码:
更好的sshpass
替代方案是:
我的
sshpass
有问题,如果没有将ssh服务器添加到我的known_主机中
sshpass
不会向我显示任何消息,passh
没有这个问题。另一个要求是必须设置显示。如果您正在运行X,则不会注意到。如果你不是,你会的。为了使上面的ssh_脚本更具可移植性,添加以下内容:export DISPLAY;DISPLAY=dummy(或者如果您没有setsid)-除了设置DISPLAY和SSH_ASKPASS之外,您可能还需要从/dev/null引导STDIN,以使SSH add确信它不在终端上:SSH add/path/to/keypass
获取密码短语,为了给ssh添加
,以一种通用的方式,根据需要生成askpass脚本。是否有人可以更新解决方案以采纳评论中的建议?相关:如果您以前没有通过ssh访问此主机,您可能还需要将-oStrictHostKeyChecking=no
传递到ssh
命令;否则,它将提示用户是否信任未知的主机密钥。显然,只有当您确信您信任未知的主机密钥时,才可以这样做。遗憾的是,这是我使用的唯一解决方案,对于ssh jumphosts来说并不太好。另一种选择是expect
,我猜这比它的工作更麻烦。自制软件(macOS)已经禁止了它:(“我们不会添加sshpass,因为它让SSH新手用户很容易破坏SSH的安全性。”你知道为什么它不起作用吗?直觉上它应该起作用。它不应该起作用,因为这会激发初级系统管理员使用SSH密码编写脚本,而SSH密码则纠缠在脚本的逻辑中。在网络和系统管理环境中,一方面需要将安全敏感信息与安全敏感信息明确分开另一方面,密码验证还不够安全。由于ssh在系统管理上下文中被广泛使用,因此尝试让用户远离仅使用密码的安全性是一个好主意。
#!/bin/bash
[[ $1 =~ password: ]] && cat || SSH_ASKPASS="$0" DISPLAY=nothing:0 exec setsid "$@"
$ echo mypass | pass ssh user@host ...