有没有办法scp -3
将文件从一台远程主机复制到另一台远程主机,两台主机都使用非标准 SSH 端口,而无需配置所涉及的每台主机~/.ssh/config
?
我已经看到了可以在每个文件参数之前使用的建议-P xxxx
,如下所示:
scp -3 -P 9000 localhost:source_file -P 9001 localhost:remote_file
但我明白:
-P: No such file or directory
9001: No such file or directory
在 Ubuntu 17.04 上。
请注意,上述情况并不像看上去那么疯狂;涉及的两个本地主机端口实际上本身就是通向另一台主机的 SSH 隧道。
答案1
Archemar 的解决方案将复制数据,但不会复制其余数据(用户、组、权限、ACL、符号链接)。因此,我建议使用 tar(如果需要,它可以一次复制整个树):
ssh -p 9000 localhost tar cf - source_file | ssh -p 9001 localhost tar xvf -
如果有必要,您可以-z
向 tar 添加开关以使其压缩数据。您可以通过添加 来选择任何目标目录-C DIRECTORY
。这不会处理源主机和目标主机上的不同文件名,因此您可能需要添加 `
ssh localhost -p 9001 "cd DIRECTORY; mv old new"
另一种简单的方法是将要复制的数据“暂时停放”在本地主机上,但很可能您已经考虑过这一点并将其丢弃。
答案2
你不能。
您所能做的就是运行 scp 作为远程命令:
ssh -p 9000 localhost "scp source_file -P 9001 localhost:remote_file"
或者,如果您不想编辑 ~/.ssh/config,请使用 -F 选项指定备用配置文件
另一个技巧是使用 sshfs:
sshfs -p 9000 localhost:/somedir /tmp/src && sshfs -p 9001 localhost:/somedir /tmp/dst && scp /tmp/src/file /tmp/dst/file && fusermount -u /tmp/src && fusermount -u /tmp/dst
答案3
我会尝试
ssh -p 9000 localhost cat source_file | ssh -p 9001 localhost "cat > remote_file"
这意味着你可以使用 ssh。另请注意:
- 文件内容将进入本地主机并从本地主机传出,
- 如果文件很小,你最好复制到临时本地位置,
- 如果文件很大,出现问题,您就必须重新启动。
编辑:tty 问题
为了避免 tty/编码问题,管道可以命名
mknod tmppipe p
scp -P 9000 localhost:startfile tmppipe &
scp -P 9001 tmppipe localhost:destfile