如何使用一行将多个命令发送到sftp


14

以下命令sftp使用一行发送一条命令:

sftp -o PasswordAuthentication=no user@host" <<<"lcd /home"

如何发送多行以sftp使用一行。是否可以插入回车符或实现此目的的方法,例如:

sftp -o PasswordAuthentication=no user@host" <<<"lcd /home\n cd /myhome\n get file"

想法是不要sftp -b在加载外部文件列表命令的位置使用该选项。

Answers:


12

<<<您使用的here-string()语法来看,我猜您的shell是bash,因此您还可以将字符串与反斜杠转义的字符($'')一起使用:

sftp -o PasswordAuthentication=no user@host <<< $'lcd /home\n cd /myhome\n get file'

便携式替代方法是此处文档:

sftp -o PasswordAuthentication=no user@host <<END
lcd /home
cd /myhome
get file
END

1
<<<最初是由zsh引入的(尽管受启发rc),后来又被添加到ksh93中,然后又添加到bash中。
斯特凡Chazelas

谢谢@StephaneChazelas。我真的需要加强我的zsh技能。
manatwork 2012年

8

使用该-b/--batchfile选项进行正确的错误处理:

 printf '%s\n' 'lcd /home' 'cd /myhome' 'get file' | sftp -b - user@host

1
要使用变量
请将

2

是的,您可以使用 echo -e

echo -e "lcd /home\ncd /myhome\nget file" | sftp user@host

3
echo是非常不标准的- echo -e并非在所有地方都一样,因此您必须先检查一下。另外,也可以使用随便printf携带的产品,并且在任何地方都可以使用。
2012年

1

不必避免-b选择避免将批处理文件写入磁盘。使用流程替换,您可以动态创建批次。

batch() {
  echo lcd /home
  echo cd /myhome
  echo get file
}

sftp -b <(batch) -o PasswordAuthentication=no user@host

0

使用本机sftp命令

sftp -o PasswordAuthentication =没有用户@主机:/ home / myhome / file


你没有注意到的是,lcdcd做不同的事情。您已经将路径组合成不存在的东西。
underscore_d

0

Mybru,您可以像下面这样通过管道传递命令:

echo '
    lcd /home
    cd /myhome
    get file
' | sftp -o PasswordAuthentication=no user@host
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.