没有ProxyCommand的多行scp的单行bash命令/功能

时间:2016-05-09 15:19:39

标签: bash scp

我有3台计算机x y z,其中z只能通过xy访问x只能通过z访问y

我想在机器~/.bashrc的{​​{1}}中编写以下命令。

现在我正在按照步骤1,2进行SCP,并且工作正常,

将z复制到x

  1. 首先从y

    scp z到y
    y
  2. 然后从y

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

    我想要做的是我想将它与单行bash功能结合起来, 即,sshpass -p root123 scp *.* root@1.2.60.4:/aaa/bbb/

    z->y->x
  3. 将x复制到z

    1. 从y

      scp x到y
      scpzx() { scp root@192.0.44.4:/disk1/{"$1"} ./ ;sshpass -p root123 scp "$1" root@1.2.60.4:/aaa/bbb/ }
      
    2. 从y

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

      我想要做的是我想将它与单行bash功能结合起来,即scp ./*.* root@192.0.44.4:/disk1/

      x->y->z
    3. 我们将scpxz() { sshpass -p root123 scp root@1.2.60.4:/aaa/bbb/{"$1"} ./ ;scp ./{"$1"} root@192.0.44.4:/disk1/ } = $1传递给file1,file2,file3scpxz()的位置。 任何帮助将不胜感激。

      P.S。 scpzx() x y台机器没有zProxyCommand又称nc

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

      我希望传递多个分隔的文件,例如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/ ;}

2 个答案:

答案 0 :(得分:1)

POST 1

如果未在脚本中创建,则此功能需要稍作更改。你必须添加一个“;”在最后一个“}”之前。我也会删除内部括号,因为在这种情况下它们并不是真的需要。

例如:

scpzx() { scp root@192.0.44.4:/disk1/"$1" ./ ;sshpass -p root123 scp "$1" 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 ;}

答案 1 :(得分:0)

您可以尝试执行:

scp -3 x:path_to_file z:path_to_file
y主机上的

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