Cara mengirim beberapa perintah ke sftp menggunakan satu baris

14

Perintah berikut mengirim satu perintah untuk sftpmenggunakan satu baris:

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

Cara mengirim beberapa baris sftpmenggunakan satu baris. Apakah ada cara untuk memasukkan carriage return atau sesuatu untuk mencapai ini, misalnya:

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

Idenya adalah untuk TIDAK menggunakan sftp -bopsi di mana perintah daftar file eksternal dimuat.

Radnaskela Samot
sumber

Jawaban:

12

Dari <<<sintaks di sini-string ( ) yang Anda gunakan, saya kira shell Anda bash, jadi Anda juga bisa menggunakan string dengan karakter backslash-escaped ( $''):

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

Alternatif portabel ada di sini-dokumen:

sftp -o PasswordAuthentication=no user@host <<END
lcd /home
cd /myhome
get file
END
manatwork
sumber
1
<<<pertama kali diperkenalkan oleh zsh (meskipun terinspirasi oleh rc) dan kemudian ditambahkan ke ksh93 dan kemudian bash.
Stéphane Chazelas
Terima kasih, @StephaneChazelas. Saya benar-benar perlu memperkuat zshketerampilan saya .
manatwork
8

Gunakan -b/--batchfileopsi untuk memiliki penanganan kesalahan yang tepat:

 printf '%s\n' 'lcd /home' 'cd /myhome' 'get file' | sftp -b - user@host
Stéphane Chazelas
sumber
1
Untuk menggunakan variabel ubah 'ke "
Radnaskela Samot
2

Ya, Anda bisa menggunakannya echo -e

echo -e "lcd /home\ncd /myhome\nget file" | sftp user@host
utopiabound
sumber
3
echosangat tidak standar - echo -etidak berfungsi sama di mana-mana, jadi Anda harus memeriksa dulu. Atau, gunakan saja printfyang jauh lebih portabel dan harus bekerja sama di mana-mana.
jw013
1

Tidak perlu menghindari -bopsi untuk menghindari penulisan file batch ke disk. Menggunakan substitusi proses, Anda dapat membuat batch on the fly.

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

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

Gunakan perintah sftp asli

sftp -o PasswordAuthentication = tidak ada pengguna @ host: / home / myhome / file

Markomafs
sumber
Yang tidak Anda perhatikan adalah itu lcddan cdmelakukan hal-hal yang berbeda. Anda baru saja menggabungkan jalur menjadi sesuatu yang tidak akan ada.
underscore_d
0

Mybru, Anda dapat mem-pipe perintah Anda seperti:

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