作为一个实验,我尝试编写一个脚本,unzip
通过管道将 ZIP 文件传输到我的服务器上ssh
,但是,如果我没有设置 SSH 密钥,并且系统提示输入密码怎么办?我仍然希望它来自,而不是来自 ZIP 文件 - 然后,一旦建立连接,stdin
我想将 ZIP 文件通过管道传输到 中(可能使用两个单独的输入管道,一个用于 SSH 密码,一个用于运行?)。unzip
unzip
ssh
/tmp
另外,我目前正在服务器上写入,然后删除,因为在我的服务器上unzip
似乎不喜欢/dev/stdin
(我正在运行 Arch,服务器正在运行 Ubuntu 20.04)。/dev/stdin
当我在会话内部进行管道传输时可以工作ssh
,当我在我的机器上进行管道传输时它可以工作,但当我从我的机器通过管道传输到ssh
.有什么理由吗?
答案1
您似乎有两个不相关的问题。
- 如何以编程方式向
ssh
.
正如评论中已经指出的那样ssh
,不是从标准输入(管道)读取密码;它读它直接从终端。因此,您无法ssh
通过管道提供密码,但您可以使用该sshpass
工具来完成此操作(您必须安装它),如下所示:
sshpass -p 'password' ssh user@host
或者您可以从文件中读取密码,而不是直接在命令行上提供密码:
sshpass -f passwordfile.txt ssh user@host
您也可以(我还没有测试过)使用plink
以下命令适用于 Linux 的 PuTTY代替ssh
。plink
接受密码作为参数:
plink -pw 'password' user@host
unzip
不接受来自标准输入的输入。
根据显示的文本unzip -hh
,unzip
根本不支持从标准输入读取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
在偏僻的计算机,而不是在您的本地计算机上(如果省略引号,该文件将在您的本地计算机上创建)。