没有 ProxyCommand 的多跳 scp 的单行 bash command/function

Single line bash command/function for multihop scp without ProxyCommand

我有3台机器xyz,其中z只能通过y和[=19访问x =] 只能通过 y.

访问 z

我想在机器 y~/.bashrc 中写入以下命令。

目前我正在按照以下步骤 1,2 执行 SCP,并且工作正常,

将z复制到x

  1. 首先将 z 从 scp 到 y

    scp root@192.0.44.4:/disk1/*.* ./
    
  2. 然后 scp y to x from y

    sshpass -p root123 scp *.*  root@1.2.60.4:/aaa/bbb/
    

    我想做的是把它组合成单行bash函数, 即 z->y->x

    scpzx() { scp root@192.0.44.4:/disk1/{""} ./ ;sshpass -p root123 scp "" root@1.2.60.4:/aaa/bbb/ }
    

将x复制到z

  1. scp 从 y 到 y

    sshpass -p root123 scp root@1.2.60.4:/aaa/bbb/*.* ./
    
  2. 从 y 到 z 的 scp

    scp ./*.* root@192.0.44.4:/disk1/
    

    我想做的是将它组合成单行bash函数,即x->y->z

    scpxz() { sshpass -p root123 scp root@1.2.60.4:/aaa/bbb/{""} ./ ;scp ./{""} root@192.0.44.4:/disk1/ }
    

我们将 </code>=<code>file1,file2,file3 传递给 scpxz()scpzx()。 任何帮助将不胜感激。

P.S。 x y z 机器没有 ProxyCommandnc aka netcat.

----[已编辑]----

我想传递由 分隔的多个文件,例如 {file1,file2} 以便它可以从 /disk1/ 读取它作为 /disk1/file1/disk1/file2 单个文件它工作正常早些时候,如果不提供大括号 { } 但我希望它与 { } 一起使用,这样我就可以传递存在于同一父目录 /disk1 中的多个文件名,因为大括号将在同一父目录下展开它,例如,例如scp /disk1/{file1,file2} 扩展为 scp /disk1/file1 /disk1/file2

我也试过了,

    scpzx() { for i in "$@"; scp root@192.0.44.4:/disk1/"$i" ./ ;sshpass -p root123 scp "$i" root@1.2.60.4:/aaa/bbb/ ;}

但我收到错误 line 17: syntax error near unexpected token scp

POST 1

未在脚本中创建的函数需要稍作更改。您必须添加一个“;”在最后一个“}”之前。我还会删除内部括号,因为在这种情况下并不真正需要它们。

例如:

scpzx() { scp root@192.0.44.4:/disk1/"" ./ ;sshpass -p root123 scp "" root@1.2.60.4:/aaa/bbb/ ;}

POST 2

如果您希望循环浏览命令行变量,这将允许您这样做。 $@ 引用传递给函数的所有命令行变量。

fTest() { for i in $@; do echo "$i"; done  ;}

对于你的脚本,它应该是这样的:

scpxz() { for i in $@; do sshpass -p root123 scp root@1.2.60.4:/aaa/bbb/"$i" ./ ;scp ./"$i" root@192.0.44.4:/disk1/; done ;}

你可以尝试执行:

scp -3 x:path_to_file z:path_to_file

y 主机上。 -3 切换确保所有传输都通过本地(在您的情况下 y)主机。