Como enviar vários comandos para o sftp usando uma linha

14

O comando a seguir envia um comando para sftpusar uma linha:

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

Como enviar várias linhas para sftpusar uma linha. Existe uma maneira de inserir retornos de carro ou algo para conseguir isso, por exemplo:

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

A idéia é NÃO usar a sftp -bopção em que um comando de listagem de arquivo externo é carregado.

Radnaskela Samot
fonte

Respostas:

12

Da <<<sintaxe here-string ( ) que você usou, acho que seu shell é bash, então você também pode usar string com caracteres de escape com barra invertida ( $''):

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

A alternativa portátil é aqui-documentar:

sftp -o PasswordAuthentication=no user@host <<END
lcd /home
cd /myhome
get file
END
homem a trabalhar
fonte
1
<<<foi introduzido primeiro pelo zsh (embora inspirado por rc) e mais tarde foi adicionado ao ksh93 e depois ao bash.
Stéphane Chazelas
Obrigado, @StephaneChazelas. Eu realmente preciso fortalecer minhas zshhabilidades.
Manatwork
8

Use a -b/--batchfileopção para ter um tratamento de erro adequado:

 printf '%s\n' 'lcd /home' 'cd /myhome' 'get file' | sftp -b - user@host
Stéphane Chazelas
fonte
1
Para usar variáveis, mude 'para "
Radnaskela Samot
2

Sim, você pode apenas usar echo -e

echo -e "lcd /home\ncd /myhome\nget file" | sftp user@host
sombrio
fonte
3
echoé muito fora do padrão - echo -enão funciona da mesma maneira em todos os lugares; portanto, você deve verificar primeiro. Como alternativa, basta usar o printfque é muito mais portátil e deve funcionar da mesma maneira em todos os lugares.
Jw013
1

Não é necessário evitar a -bopção de gravar o arquivo em lotes no disco. Usando a substituição do processo, você pode criar o lote rapidamente.

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

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

Use o comando sftp nativo

sftp -o PasswordAuthentication = nenhum usuário @ host: / home / myhome / file

Markomafs
fonte
O que você não percebeu foi isso lcde cdfez coisas diferentes. Você acabou de combinar os caminhos em algo que não existirá.
Underscore_d
0

Mybru, você pode exibir seus comandos da seguinte maneira:

echo '
    lcd /home
    cd /myhome
    get file
' | sftp -o PasswordAuthentication=no user@host
Paque Mann
fonte