我想传递一个密码来ssh使用bash脚本(是的,我知道我可以使用ssh密钥,但这不是我想要的).
我找到了一些正在使用的解决方案,expect但由于它不是标准的bash工具,我想知道我是否可以使用管道来做到这一点.
有人可以向我解释,为什么会这样:
echo "password\n" | ssh somehost.com
Run Code Online (Sandbox Code Playgroud)
要么
ssh somehost.com <(echo "password\n")
Run Code Online (Sandbox Code Playgroud)
不起作用?有没有可能使它工作?也许ssh作为一个不同的进程执行,获取它的PID,然后直接发送一个字符串给它?
CS *_*Pei 64
您无法从命令行指定密码,但可以使用ssh密钥或使用sshpassJohn C.或使用expect脚本建议的密码.
要使用sshpass,您需要先安装它.然后
sshpass -f <(printf '%s\n' your_password) ssh user@hostname
Run Code Online (Sandbox Code Playgroud)
而不是使用sshpass -p your_password.正如Charles Duffy评论中所提到的,从文件或变量而不是命令行提供密码更安全.
BTW,对<(command)语法的一点解释.shell在括号内执行命令,并用文件描述符替换整个命令,文件描述符连接到命令的stdout.你可以从这个答案中找到更多信息https://unix.stackexchange.com/questions/156084/why-does-process-substitution-result-in-a-file-called-dev-fd-63-which-is-a -管
Lib*_*t0r 36
由于我的问题没有确切的答案,我做了一些调查,为什么当其他解决方案有效时我的代码不起作用,并决定发布我发现完成主题的内容.
事实证明:
"ssh使用直接TTY访问来确保密码确实是由交互式键盘用户发出的." sshpass手册页
它回答了这个问题,为什么在这种情况下管道不起作用.显而易见的解决方案是创建条件,以便ssh"认为"它在常规终端中运行,并且因为它可以通过简单的posix功能来完成,所以它超出了简单的要求bash.