Cómo enviar múltiples comandos a sftp usando una línea


14

El siguiente comando envía un comando para sftpusar una línea:

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

Cómo enviar múltiples líneas para sftpusar una línea. ¿Hay alguna manera de insertar retornos de carro o algo para lograr esto, por ejemplo:

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

La idea es NO usar la sftp -bopción donde se cargan comandos de listado de archivos externos.

Respuestas:


12

De la <<<sintaxis here-string ( ) que usó, supongo que su shell es bash, por lo que también puede usar string con caracteres con barra invertida ( $''):

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

La alternativa portátil es el siguiente documento:

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

1
<<<fue introducido primero por zsh (aunque inspirado en rc) y luego fue agregado a ksh93 y luego a bash.
Stéphane Chazelas

Gracias, @StephaneChazelas. Realmente necesito fortalecer mis zshhabilidades.
manatwork el

8

Use la -b/--batchfileopción para tener un manejo adecuado de errores:

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

1
Para usar variables, cambie 'a "
Radnaskela Samot

2

Sí, solo puedes usar echo -e

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

3
echoes muy no estándar, echo -eno funciona igual en todas partes, por lo que primero debe verificarlo. Alternativamente, simplemente use el printfque es mucho más portátil y debería funcionar igual en todas partes.
jw013

1

No es necesario evitar la -bopción de evitar escribir el archivo por lotes en el disco. Mediante la sustitución de procesos , puede crear el lote sobre la marcha.

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

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

0

Usar comando sftp nativo

sftp -o PasswordAuthentication = no user @ host: / home / myhome / file


Lo que no notó fue eso lcdy cdhacer cosas diferentes. Acaba de combinar los caminos en algo que no existirá.
underscore_d

0

Mybru, puedes canalizar tus comandos así:

echo '
    lcd /home
    cd /myhome
    get file
' | sftp -o PasswordAuthentication=no user@host
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.