linux 在pure bash中将密码传递给ssh

carvr3hs  于 2023-03-01  发布在  Linux
关注(0)|答案(3)|浏览(111)

我想使用bash脚本将密码传递给ssh(是的,我知道可以使用ssh密钥,但这不是我想要的)。
我发现了一些使用expect的解决方案,但由于它不是标准的bash工具,我想知道是否可以使用管道来实现这一点。
有人能给我解释一下,为什么会这样:

echo "password\n" | ssh somehost.com

ssh somehost.com <(echo "password\n")

不工作?有没有可能让它工作?也许作为一个不同的进程执行ssh,获得它的PID,然后直接向它发送一个字符串?

46scxncf

46scxncf1#

您不能从命令行指定密码,但可以使用ssh密钥或使用John C.建议的sshpass或使用expect脚本。
要使用sshpass,首先需要安装它。

sshpass -f <(printf '%s\n' your_password) ssh user@hostname

正如Charles Duffy在注解中提到的,从文件或变量中提供密码比从命令行中提供密码更安全。
顺便说一句,对<(command)语法做一点解释。shell执行括号内的命令,并将整个命令替换为一个文件描述符,该文件描述符连接到命令的stdout。

ncgqoxb0

ncgqoxb02#

由于我的问题没有确切的答案,我做了一些调查,为什么我的代码不工作时,有其他解决方案的工作,并决定张贴我的发现,以完成主题。
事实证明:
"ssh使用直接TTY访问来确保密码确实是由交互式键盘用户发出的。" sshpass manpage
这就回答了为什么管道在这种情况下不工作的问题。显而易见的解决方案是创造条件,使ssh "认为"它是在常规终端中运行的,由于它可以通过简单的posix函数来实现,因此它超出了简单的bash所提供的功能。

h7wcgrx3

h7wcgrx33#

如果你需要使用密码验证,那么更安全的方法是将密码从密码库发送到剪贴板,然后在ssh提示时粘贴它。在下面的脚本中,一个凭据被传递到密码库pass,然后任何附加参数被传递到ssh。你可以在其他脚本中使用下面的脚本来进一步自动化ssh的使用。
例如

#!/bin/bash
USAGE="USAGE: passtossh credential ..."
[[ $# -lt 2 ]] && echo "$USAGE" && exit 64
CRED="$1"
shift
echo "Creating a ssh connection using credentials $CRED with parameters $@ ."
echo "$(pass "$CRED")" | tr -d '\n' | pbcopy
ssh $@

您可以按如下方式使用此脚本(例如,对主机使用ssh沿着添加任何其他参数):

$ passtossh my_credential user@host -L 8888:localhost:8888

当提示时,只需粘贴密码。Pbcopy是用于将stdin发送到剪贴板的MacOS实用程序。对于windows clip,对于linux,请参见例如link
好处是密码不会出现在日志中,而且密码只能通过您对密码存储库进行的任何身份验证来访问。

相关问题