Jak wysłać wiele poleceń do sftp za pomocą jednej linii

14

Następujące polecenie powoduje wysłanie jednego polecenia do sftpjednego wiersza:

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

Jak wysłać wiele linii do sftpkorzystania z jednej linii. Czy istnieje sposób wstawiania zwrotów karetki lub coś takiego, na przykład:

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

Chodzi o to, aby NIE używać sftp -bopcji, w której ładowane są polecenia zewnętrznego wyświetlania plików.

Radnaskela Samot
źródło

Odpowiedzi:

12

Ze <<<składni here-string ( ), której użyłeś, domyślam się, że twoja powłoka jest bash, więc możesz także używać łańcucha znaków ze znakami odwrotnego ukośnika ( $''):

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

Przenośną alternatywą jest tutaj dokument:

sftp -o PasswordAuthentication=no user@host <<END
lcd /home
cd /myhome
get file
END
człowiek w pracy
źródło
1
<<<został wprowadzony najpierw przez zsh (choć zainspirowany przez rc), a następnie dodany do ksh93, a następnie bash.
Stéphane Chazelas
Dziękuję, @StephaneChazelas. Naprawdę muszę wzmocnić swoje zshumiejętności.
manatwork,
8

Użyj -b/--batchfileopcji, aby mieć właściwą obsługę błędów:

 printf '%s\n' 'lcd /home' 'cd /myhome' 'get file' | sftp -b - user@host
Stéphane Chazelas
źródło
1
Aby użyć zmiennych, zmień „na”
Radnaskela Samot
2

Tak, możesz po prostu użyć echo -e

echo -e "lcd /home\ncd /myhome\nget file" | sftp user@host
utopiabound
źródło
3
echojest bardzo niestandardowy - echo -enie działa wszędzie tak samo, więc najpierw musisz to sprawdzić. Alternatywnie, po prostu użyj, printfktóry jest znacznie bardziej przenośny i powinien działać wszędzie tak samo.
jw013,
1

Nie trzeba unikać -bopcji zapisywania pliku wsadowego na dysk. Korzystając z podstawiania procesów , możesz utworzyć partię w locie.

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

sftp -b <(batch) -o PasswordAuthentication=no user@host
Ceving
źródło
0

Użyj natywnej komendy sftp

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

Markomafs
źródło
Nie zauważyłeś tego lcdi robiłeś cdróżne rzeczy. Właśnie połączyłeś ścieżki w coś, co nie będzie istnieć.
underscore_d
0

Mybru, możesz wprowadzać swoje polecenia w następujący sposób:

echo '
    lcd /home
    cd /myhome
    get file
' | sftp -o PasswordAuthentication=no user@host
Paque Mann
źródło