如果需要,提示输入 ssh 密码,然后通过管道进入 ssh 会话

如果需要,提示输入 ssh 密码,然后通过管道进入 ssh 会话

作为一个实验,我尝试编写一个脚本,unzip通过管道将 ZIP 文件传输到我的服务器上ssh,但是,如果我没有设置 SSH 密钥,并且系统提示输入密码怎么办?我仍然希望它来自,而不是来自 ZIP 文件 - 然后,一旦建立连接,stdin我想将 ZIP 文件通过管道传输到 中(可能使用两个单独的输入管道,一个用于 SSH 密码,一个用于运行?)。unzipunzipssh

/tmp另外,我目前正在服务器上写入,然后删除,因为在我的服务器上unzip似乎不喜欢/dev/stdin(我正在运行 Arch,服务器正在运行 Ubuntu 20.04)。/dev/stdin当我在会话内部进行管道传输时可以工作ssh,当我在我的机器上进行管道传输时它可以工作,但当我从我的机器通过管道传输到ssh.有什么理由吗?

答案1

您似乎有两个不相关的问题。

  1. 如何以编程方式向ssh.

正如评论中已经指出的那样ssh不是从标准输入(管道)读取密码;它读它直接从终端。因此,您无法ssh通过管道提供密码,但您可以使用该sshpass工具来完成此操作(您必须安装它),如下所示:

sshpass -p 'password' ssh user@host

或者您可以从文件中读取密码,而不是直接在命令行上提供密码:

sshpass -f passwordfile.txt ssh user@host

您也可以(我还没有测试过)使用plink以下命令适用于 Linux 的 PuTTY代替sshplink接受密码作为参数:

plink -pw 'password' user@host
  1. unzip不接受来自标准输入的输入。

根据显示的文本unzip -hhunzip根本不支持从标准输入读取zip文件。如果您想解压缩通过 stdin 提供的文件,您应该使用该funzip实用程序,如下所示:

cat file.zip | funzip >file.out

或者

funzip <file.zip >file.out

但是,请注意,funzip仅从 zip 文件中提取第一个文件。

因此,将这两者结合起来,您将必须使用以下命令:

cat file.zip | sshpass -p 'password' ssh user@host "funzip >file.out"

或者

sshpass -p 'password' ssh user@host "funzip >file.out" <file.zip

将命令括funzip >file.out在引号中会导致file.out偏僻的计算机,而不是在您的本地计算机上(如果省略引号,该文件将在您的本地计算机上创建)。

相关内容