我想使用bash脚本将密码传递给ssh
(是的,我知道可以使用ssh密钥,但这不是我想要的)。
我发现了一些使用expect
的解决方案,但由于它不是标准的bash工具,我想知道是否可以使用管道来实现这一点。
有人能给我解释一下,为什么会这样:
echo "password\n" | ssh somehost.com
或
ssh somehost.com <(echo "password\n")
不工作?有没有可能让它工作?也许作为一个不同的进程执行ssh
,获得它的PID,然后直接向它发送一个字符串?
3条答案
按热度按时间46scxncf1#
您不能从命令行指定密码,但可以使用ssh密钥或使用John C.建议的
sshpass
或使用expect
脚本。要使用sshpass,首先需要安装它。
正如
Charles Duffy
在注解中提到的,从文件或变量中提供密码比从命令行中提供密码更安全。顺便说一句,对
<(command)
语法做一点解释。shell执行括号内的命令,并将整个命令替换为一个文件描述符,该文件描述符连接到命令的stdout。ncgqoxb02#
由于我的问题没有确切的答案,我做了一些调查,为什么我的代码不工作时,有其他解决方案的工作,并决定张贴我的发现,以完成主题。
事实证明:
"ssh使用直接TTY访问来确保密码确实是由交互式键盘用户发出的。" sshpass manpage
这就回答了为什么管道在这种情况下不工作的问题。显而易见的解决方案是创造条件,使
ssh
"认为"它是在常规终端中运行的,由于它可以通过简单的posix
函数来实现,因此它超出了简单的bash
所提供的功能。h7wcgrx33#
如果你需要使用密码验证,那么更安全的方法是将密码从密码库发送到剪贴板,然后在ssh提示时粘贴它。在下面的脚本中,一个凭据被传递到密码库pass,然后任何附加参数被传递到ssh。你可以在其他脚本中使用下面的脚本来进一步自动化ssh的使用。
例如
您可以按如下方式使用此脚本(例如,对主机使用ssh沿着添加任何其他参数):
当提示时,只需粘贴密码。Pbcopy是用于将stdin发送到剪贴板的MacOS实用程序。对于windows
clip
,对于linux,请参见例如link。好处是密码不会出现在日志中,而且密码只能通过您对密码存储库进行的任何身份验证来访问。