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.

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

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

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

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

0

Użyj natywnej komendy sftp

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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.