Как отправить несколько команд в 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опцию, в которой загружаются внешние команды перечисления файлов.

Раднаскела Самот
источник

Ответы:

12

Из <<<синтаксиса here-string ( ), который вы использовали, я предполагаю, что ваша оболочка такова 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
manatwork
источник
1
<<<сначала был представлен zsh (хотя и вдохновлен rc), а затем был добавлен в ksh93, а затем в bash.
Стефан Шазелас
Спасибо, @StephaneChazelas. Мне действительно нужно укрепить свои zshнавыки.
Манатворк
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
utopiabound
источник
3
echoочень нестандартно - echo -eне везде работает одинаково, так что вам нужно сначала проверить. В качестве альтернативы, просто используйте, printfкоторый является гораздо более портативным и должен работать везде одинаково.
jw013
1

Нет необходимости избегать -bопции, позволяющей избежать записи командного файла на диск. Используя процесс замены, вы можете создать пакет на лету.

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

sftp -b <(batch) -o PasswordAuthentication=no user@host
ceving
источник
0

Используйте нативную команду sftp

sftp -o PasswordAuthentication = нет пользователя @ хост: / home / myhome / file

Markomafs
источник
То, что вы не заметили, было это lcdи cdделать разные вещи. Вы только что объединили пути в то, чего не будет.
underscore_d
0

Mybru, вы можете передать свои команды следующим образом:

echo '
    lcd /home
    cd /myhome
    get file
' | sftp -o PasswordAuthentication=no user@host
Пак Манн
источник