在纯粹的bash中将密码传递给ssh

Lib*_*t0r 36 linux bash pipe

我想传递一个密码来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 -管

  • 从安全角度来看,密码应该永远不会在命令行上传递 - 命令行对整个系统是可见的; 甚至在命令行启动后更改命令行的命令也很容易在临时中捕获.如果你必须*使用该工具,还有其他更安全的`sshpass`使用模式. (2认同)

Lib*_*t0r 36

由于我的问题没有确切的答案,我做了一些调查,为什么当其他解决方案有效时我的代码不起作用,并决定发布我发现完成主题的内容.
事实证明:

"ssh使用直接TTY访问来确保密码确实是由交互式键盘用户发出的." sshpass手册页

它回答了这个问题,为什么在这种情况下管道不起作用.显而易见的解决方案是创建条件,以便ssh"认为"它在常规终端中运行,并且因为它可以通过简单的posix功能来完成,所以它超出了简单的要求bash.

  • 由于你最终链接到sshpass,我认为你应该给予其他人信用答案. (7认同)
  • 我建议你先阅读问题的内容,而不是添加对主题没有任何意义的评论. (3认同)
  • 如果你的问题真的只是关于为什么事物-X不起作用,你的标题应该反映出来,而不是关于如何实现*目标*那个事物-X否则将会表现.现在,问题的主体侧重于该领域,但标题是完成任务. (2认同)
  • @CharlesDuffy“纯 bash”如何不反映使用标准 bash 调用的需要?你做了什么样的心理锻炼才得出这样的结论? (2认同)
  • @BłażejMichalik,......所以,我一直在说的是,标题应该反映出问题在身体中给出的意图.我不反对OP的意图是不依赖于POSIX未指定的工具,内置于bash中,或作为SSH包的一部分提供.我*反对他们的问题的标题是不适合该问题的意图. (2认同)