用于无ProxyCommand的多跳scp的单行bash命令/函数

用于无ProxyCommand的多跳scp的单行bash命令/函数,bash,scp,Bash,Scp,我有3台机器xyz,其中z只能通过y访问x,x只能通过y访问z 我想在机器y的~/.bashrc中编写以下命令 目前,我正在按照以下步骤1、2进行SCP,其工作正常 将z复制到x 从y到y的第一个scp z scp root@192.0.44.4:/disk1/*.* ./ 然后将y从y压缩到x sshpass -p root123 scp *.* root@1.2.60.4:/aaa/bbb/ 我想做的是把它和单行bash函数结合起来, i、 e,z->y->x scpzx() { s

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

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

目前,我正在按照以下步骤1、2进行SCP,其工作正常

将z复制到x

  • 从y到y的第一个scp z

    scp root@192.0.44.4:/disk1/*.* ./
    
  • 然后将y从y压缩到x

    sshpass -p root123 scp *.*  root@1.2.60.4:/aaa/bbb/
    
    我想做的是把它和单行bash函数结合起来, i、 e,
    z->y->x

    scpzx() { scp root@192.0.44.4:/disk1/{"$1"} ./ ;sshpass -p root123 scp "$1" root@1.2.60.4:/aaa/bbb/ }
    
  • 将x复制到z

  • scp x从y到y

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

    scp ./*.* root@192.0.44.4:/disk1/
    
    我想做的是将它与单行bash函数相结合,即,
    x->y->z

    scpxz() { sshpass -p root123 scp root@1.2.60.4:/aaa/bbb/{"$1"} ./ ;scp ./{"$1"} root@192.0.44.4:/disk1/ }
    
  • 我们将
    $1
    =
    file1、file2、file3
    传递到
    scpxz()
    scpzx()
    。 任何帮助都将不胜感激

    另外,机器没有
    ProxyCommand
    nc
    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/ ;}
    

    但是我在第17行得到错误:意外标记scp附近的语法错误

    如果不是在脚本中创建,则需要对函数进行轻微更改。必须在最后一个“}”之前添加“;”。我也会删除内部括号,因为它们在这种情况下并不真正需要

    例如:

    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 ;}
    
    您可以尝试执行:

    scp -3 x:path_to_file z:path_to_file
    

    y
    主机上<代码>-3开关确保所有传输都通过本地(在您的情况下是
    y
    )主机。

    所有这些命令都是从“y”运行的吗?如:Y从Z获取,然后放入Z?只有
    Y
    可以复制并放入x和Z,即我正在执行上述
    Y
    中的所有命令。它类似于“XYZ”,但不可能直接
    XZ
    我认为“将z复制到x”部分有一个输入错误,因为这里没有提到服务器x-第2点应该是“从y到x的scyp y”,对吗?[纠正了输入错误]-谢谢你纠正我。可能重复的我希望传递多个由
    分隔的文件,如{file1,file2}这样,它就可以用单个文件从/disk1/as
    /disk1/file1
    /disk1/file2
    中读取它。它的工作很好,就像不提供花括号
    {}
    但我希望它与
    {}一起使用一样
    以便我可以传递同一父目录中存在的多个文件名
    /disk1
    ,因为花括号将在同一父目录下展开它。e、 g.scp
    /disk1/{file1,file2}
    扩展到
    scp/disk1/file1/disk1/file2
    我尝试了循环方法,您的答案是访问多个文件,我在编辑的问题中提到了这一点,这给了我bash错误`@ypp,我已经更新了上面的答案,以适应作为命令行参数传入的多个文件。让我知道它是如何为你工作的。我唯一做的改变是我把scp cmd和&&结合起来。多谢各位@jgshawkey@ypp,没问题。使用&&的好主意是在第二个启动之前确保第一个成功。保重<代码>scp:非法选项--3
    用法:scp[-1246BCpqrv][c密码][F ssh\U配置][i身份文件]
    [-l限制][o ssh\U选项][P端口][S程序]
    `[[user@]host1:]file1。。。[[user@]host2:]file2`它是在2010年或2011年添加到scp的,因此您的scp版本有点过时。scp似乎过时了,我无法更新scp版本,因为许多其他人使用这些系统,所以我不想碰它。这就是为什么我在寻找更传统的基本方法来实现它。