没有 ProxyCommand 的多跳 scp 的单行 bash command/function
Single line bash command/function for multihop scp without ProxyCommand
我有3台机器x
y
z
,其中z
只能通过y
和[=19访问x
=] 只能通过 y
.
访问 z
我想在机器 y
的 ~/.bashrc
中写入以下命令。
目前我正在按照以下步骤 1,2 执行 SCP,并且工作正常,
将z复制到x
首先将 z 从 scp 到 y
scp root@192.0.44.4:/disk1/*.* ./
然后 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
scp 从 y 到 y
sshpass -p root123 scp root@1.2.60.4:/aaa/bbb/*.* ./
从 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
机器没有 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/ ;}
但我收到错误 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
)主机。
我有3台机器x
y
z
,其中z
只能通过y
和[=19访问x
=] 只能通过 y
.
z
我想在机器 y
的 ~/.bashrc
中写入以下命令。
目前我正在按照以下步骤 1,2 执行 SCP,并且工作正常,
将z复制到x
首先将 z 从 scp 到 y
scp root@192.0.44.4:/disk1/*.* ./
然后 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
scp 从 y 到 y
sshpass -p root123 scp root@1.2.60.4:/aaa/bbb/*.* ./
从 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
机器没有 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/ ;}
但我收到错误 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
)主机。