Answers:
这是一成不变的。
当人们用来ssh
在远程服务器上执行命令时,它会执行某种形式的内部输入/输出重定向。实际上,我发现这是OpenSSH更好的功能之一。具体而言,如果使用ssh
一个远程系统上执行的任意命令,则SSH将映射STDIN
和STDOUT
到该命令的执行。
出于示例目的,假设您要创建一个备份tarball,但是不希望或不能在本地存储它。让我们来看看以下语法:
$ tar -cf - /path/to/backup/dir | ssh remotehost "cat - > backupfile.tar"
我们正在创建一个tarball,并将其写入STDOUT
常规内容。由于我们使用ssh来执行远程命令,标准输入被映射到STDIN
的cat
。然后我们将其重定向到文件。
netcat
两端都提供了一个简单,易用的沟通渠道。tar cf - /path/to/dir | nc 1.2.3.4 5000
在一个服务器上,nc -l -p 5000 > backupfile.tar
在另一台服务器上。
当您不必担心导线的安全性时,在主机之间管道传输数据的便捷方法是netcat
在连接的两端使用。
这也使您可以异步设置它们:
在“接收器”上(实际上,您将进行双向通信,但这样想起来更容易),运行:
nc -l -p 5000 > /path/to/backupfile.tar
然后在“发送者”上运行:
tar cf - /path/to/dir | nc 1.2.3.4 5000
用于创建单向和双向连接的功能非常强大的工具是socat
。要简要了解各种可能性,请查看其联机帮助页中的示例。
它netcat
完全替代了类似的工具,并支持ssl加密连接。对于初学者来说,这可能还不够简单,但是至少知道它的存在是一件好事。
当您拥有必须使用的堡垒服务器时,事情只会变得稍微复杂一些。
您可以像这样传递ssh
命令ssh
:
cat local_script.sh | ssh -A usera@bastion ssh -A userb@privateserver "cat > remote_copy_of_local_script.sh; bash remote_copy_of_local_script.sh"
当心伪终端
请注意,这里ssh
最重要的一点是,像大多数工具一样,默认情况下也只是对待stdout
和stdin
纠正。
但是,当您开始看到类似的选项时Disable pseudo-terminal allocation.
,Force pseudo-terminal allocation.
可能需要进行一些反复试验。但是,通常来说,tty
除非您试图修复终端仿真器中的乱码/二进制垃圾(人类输入的内容),否则您不希望更改行为。
例如,我倾向于使用-At
以便转发工作站的ssh-agent,并确保远程运行tmux不会禁止二进制文件(例如ssh -At bastion.internal tmux -L bruno attach
)。而且,对于docker而言(也是如此sudo docker exec -it jenkins bash
)。
但是,-t
当我尝试执行以下操作时,这两个标志会导致一些难以追踪的数据损坏:
# copy /etc/init from jenkins to /tmp/init in testjenkins running as a container
ssh -A bastion.internal \
ssh -A jenkins.internal \
sudo tar cf - -C /etc init | \
sudo docker exec -i testjenkins \
bash -c 'tar xvf - -C /tmp'
# note trailing slashes to make this oneliner more readable.
我发现这是最简单的,在为您运行命令的用户在服务器之间未设置密码握手后:
未压缩
tar cf - . | ssh servername "cd /path-to-dir && tar xf -"
动态压缩
tar czf - . | ssh servername "cd /path-to-dir && tar xzf -"
ssh
已经配置了压缩,那么在tar文件上使用压缩是一个非常糟糕的主意。
Compression
可以在任何配置文件中进行设置,对此的快速检查是查看是否ssh -v localhost exit 2>&1 | fgrep -i compress
提供任何输出(AFAIK没有选项,因为ssh已读入配置)。
tar
具有-C path
适用于c
和x
命令的标志。您无需cd
在其中放置单独的命令。(但要注意,您可以运行多个命令。)
-C
是GNU扩展(虽然现在还让bsdtar和席利焦油支持)