Bagaimana menjalankan perintah sftp dengan kata sandi dari skrip Bash?

173

Saya perlu mentransfer file log ke host jarak jauh menggunakan sftp dari host Linux. Saya telah diberikan kredensial untuk hal yang sama dari grup operasi saya. Namun, karena saya tidak memiliki kendali atas host lain, saya tidak dapat membuat dan membagikan kunci RSA dengan host lain.

Jadi apakah ada cara untuk menjalankan sftpperintah (dengan nama pengguna / kata sandi yang disediakan) dari dalam skrip Bash melalui pekerjaan cron ?

Saya menemukan pertanyaan Stack Overflow yang serupa, Tentukan kata sandi untuk sftp dalam skrip Bash , tetapi tidak ada jawaban yang memuaskan untuk masalah saya.

anubhava
sumber

Jawaban:

178

Anda memiliki beberapa opsi selain menggunakan otentikasi kunci publik:

  1. Gunakan gantungan kunci
  2. Gunakan sshpass (kurang aman tetapi mungkin memenuhi persyaratan Anda)
  3. Gunakan ekspektasi (paling tidak aman dan lebih banyak pengkodean diperlukan)

Jika Anda memutuskan untuk memberi sshpass kesempatan di sini adalah cuplikan skrip yang berfungsi untuk melakukannya:

export SSHPASS=your-password-here
sshpass -e sftp -oBatchMode=no -b - sftp-user@remote-host << !
   cd incoming
   put your-log-file.log
   bye
!
anubhava
sumber
3
Untuk menggunakannya di Mac: stackoverflow.com/questions/9102557/…
anubhava
18
Tidak perlu ekspor, saya pikir. SSHPASS=password sshpass -e ...harus dilakukan.
Jens
9
Saya dapat melakukan one-liner untuk memuat file log:sshpass -p "my_password" sftp -oPort=9999 user@host:dir/file.log
Cloud Artisans
6
@gorus: One-liner sangat keren namun saya tidak ingin menggunakan kata sandi pada command line karena risiko pengintaian yang ditingkatkan.
anubhava
8
-oBatchMode=noadalah bagian penting yang hilang bagi saya.
richardkmiller
99

Cara lain adalah dengan menggunakan lftp:

lftp sftp://user:password@host  -e "put local-file.name; bye"

Kerugian dari metode ini adalah bahwa pengguna lain di komputer dapat membaca kata sandi dari alat seperti psdan bahwa kata sandi dapat menjadi bagian dari riwayat shell Anda.

Alternatif yang lebih aman yang tersedia sejak LFTP 4.5.0 adalah mengatur LFTP_PASSWORDvariabel lingkungan dan menjalankan lftp bersama --env-password. Ini contoh lengkapnya:

LFTP_PASSWORD="just_an_example"
lftp --env-password sftp://user@host  -e "put local-file.name; bye"

LFTP juga menyertakan fitur mirroring keren (dapat menyertakan hapus setelah transfer dikonfirmasi --Remove-source-files):

lftp -e 'mirror -R /local/log/path/ /remote/path/' --env-password -u user sftp.foo.com
Karassik
sumber
9
+1 untuk menyarankan alternatif tetapi bisakah kita menghindari pemberian kata sandi di baris perintah?
anubhava
1
Diturunkan karena menunjukkan kata sandi kepada siapa pun di komputer yang sama
Aaron Digulla
10
Anda dapat membuat file skrip untuk lftp, dengan cara ini Anda tidak perlu memberikan kata sandi di baris perintah. Buat file put-script: open sftp://user:password@host; put local-file.name; exit Dari jalankan lftp -f put-script Dengan cara ini Anda tidak harus memiliki nama pengguna dan kata sandi di baris perintah dan dapat mengatur izin terbatas untuk file skrip Anda.
obaranovsky
@obaranovsky Itu ide yang bagus. Saya ingin tahu apakah saya menambahkan ini ke variabel lingkungan saya sebagai alias atau fungsi, apakah akan aman dan mungkin menyembunyikannya dari pengguna lain?
sdkks
1
Jauh lebih mudah dilakukan lftpdaripada dipusingkan dengan sftpdan sshpass. Jawaban yang bagus.
MeanEYE
53

Harapkan adalah program yang bagus untuk digunakan.

Di Ubuntu instal dengan:

sudo apt-get install expect

Pada Mesin CentOS instal dengan:

yum install expect

Katakanlah Anda ingin membuat koneksi ke server sftp dan kemudian mengunggah file lokal dari mesin lokal Anda ke server sftp jarak jauh

#!/usr/bin/expect

spawn sftp username@hostname.com
expect "password:"
send "yourpasswordhere\n"
expect "sftp>"
send "cd logdirectory\n"
expect "sftp>"
send "put /var/log/file.log\n"
expect "sftp>"
send "exit\n"
interact

Ini membuka koneksi sftp dengan kata sandi Anda ke server.

Kemudian masuk ke direktori tempat Anda ingin mengunggah file Anda, dalam hal ini "logdirectory"

Ini mengunggah file log dari direktori lokal yang ditemukan di / var / log / dengan nama file menjadi file.log ke "logdirectory" di server jarak jauh

rezizter
sumber
Terima kasih atas jawaban Anda, saya berharap sebagai salah satu opsi saya untuk mencapai tugas ini.
anubhava
Terima kasih. Saya menemukan jawaban Anda melalui pencarian, menggunakannya dan berhasil membuat skrip dengan harapan. Baru saja memposting script untuk poterity
rezizter
Terima kasih banyak atas jawaban Anda, saya telah memutarnya :)
anubhava
Saya menggunakan ini untuk memasukkan frasa sandi untuk kunci pribadi ssh. Lebih mudah untuk meletakkan kunci publik yang sama di semua server dan hanya memutar frasa sandi kunci pribadi secara berkala.
sdkks
24

Anda dapat menggunakan lftp secara interaktif dalam skrip shell sehingga kata sandi tidak disimpan dalam .bash_history atau serupa dengan melakukan hal berikut:

vi test_script.sh

Tambahkan yang berikut ke file Anda:

#!/bin/sh
HOST=<yourhostname>
USER=<someusername>
PASSWD=<yourpasswd>

cd <base directory for your put file>

lftp<<END_SCRIPT
open sftp://$HOST
user $USER $PASSWD
put local-file.name
bye
END_SCRIPT

Dan tulis / keluar editor vi setelah Anda mengedit host, pengguna, pass, dan direktori untuk mengetikkan file put Anda. :wqKemudian buat skrip Anda dapat dieksekusi chmod +x test_script.shdan jalankan ./test_script.sh.

Mike S.
sumber
2
Untuk menimpa file yang ada, tambahkan "set xfer: clobber on" setelah lftp << END_SCRIPT
Balaji Natarajan
17

Saya baru-baru ini diminta untuk beralih dari ftp ke sftp, untuk mengamankan pengiriman file antar server. Kami menggunakan paket Tectia SSH, yang memiliki opsi --passworduntuk meneruskan kata sandi pada baris perintah.

contoh: sftp --password="password" "userid"@"servername"

Contoh batch:

(
  echo "
  ascii
  cd pub
  lcd dir_name
  put filename
  close
  quit
    "
) | sftp --password="password" "userid"@"servername"

Saya pikir saya harus membagikan informasi ini, karena saya melihat berbagai situs web, sebelum menjalankan perintah bantuan ( sftp -h), dan saya terkejut melihat opsi kata sandi.

Mahony
sumber
9
+1 untuk Anda saran yang bagus. Namun ini mengharuskan Anda untuk memasukkan kata sandi pada baris perintah dan siapa pun di sistem yang melakukan psperintah akan dapat melihat kata sandi Anda.
anubhava
4
Saya mencobanya, saya dapatunknown option -- - usage: sftp [-1246aCfpqrv] [-B buffer_size] [-b batchfile] [-c cipher] [-D sftp_server_path] [-F ssh_config] [-i identity_file] [-l limit] [-o ssh_option] [-P port] [-R num_requests] [-S program] [-s subsystem | sftp_server] host sftp [user@]host[:file ...] sftp [user@]host[:dir[/]] sftp -b batchfile [user@]host
cyber8200
1
@ mungkin karena Anda membutuhkan Techia SSH , bukan OpenSSH
qris
17

Anda dapat mengganti dengan mengaktifkan otentikasi yang lebih sedikit. Tetapi Anda harus menginstal kunci (pub, priv) sebelum pergi untuk itu.

Jalankan perintah berikut di server lokal.

Local $> ssh-keygen -t rsa 

Tekan ENTER untuk semua opsi yang diminta. Tidak ada nilai yang perlu diketik.

Local $> cd .ssh
Local $> scp .ssh/id_rsa.pub user@targetmachine:
Prompts for pwd$>  ENTERPASSWORD

Terhubung ke server jauh menggunakan perintah berikut

Local $> ssh user@targetmachine
Prompts for pwd$> ENTERPASSWORD

Jalankan perintah berikut di server jauh

Remote $> mkdir .ssh
Remote $> chmod 700 .ssh
Remote $> cat id_rsa.pub >> .ssh/authorized_keys
Remote $> chmod 600 .ssh/authorized_keys
Remote $> exit

Jalankan perintah berikut di server lokal untuk menguji otentikasi tanpa kata sandi. Itu harus terhubung tanpa kata sandi.

$> ssh user@targetmachine
SriniV
sumber
1
+1 untuk jawaban Anda tetapi pertanyaannya adalah tentang melakukannya tanpa kunci publik / pribadi.
anubhava
oops .. Baru melihat batasan berbagi kunci :)
SriniV
Karena penasaran akan perintah ini lftp -p ${port} -u ${login_id},${password} ${ip_number}ketika dipanggil dari skrip shell mencetaknya di suatu tempat? Bagaimana Anda menyelesaikannya selain sshpass?
SriniV
Saya tidak memiliki lftpdan mengandalkan sshpassdari Mac dan Linux keduanya.
anubhava
Emas murni. Terima kasih! :)
Nikolay Tsenkov
7

Gabungkan sshpass dengan file kredensial yang dikunci dan, dalam praktiknya, seaman apa pun - jika Anda mendapatkan root pada kotak untuk membaca file kredensial, semua taruhan tetap tidak aktif.

Harding yang Kaya
sumber
5

Program Bash untuk menunggu sftp untuk meminta kata sandi lalu kirimkan bersama:

#!/bin/bash
expect -c "
spawn sftp username@your_host
expect \"Password\"
send \"your_password_here\r\"
interact "

Anda mungkin perlu menginstal mengharapkan, mengubah kata-kata 'Kata Sandi' menjadi huruf kecil 'p' untuk mencocokkan dengan apa yang diterima oleh prompt Anda. Masalahnya di sini adalah itu mengekspos kata sandi Anda dalam teks biasa dalam file serta dalam sejarah perintah. Yang hampir mengalahkan tujuan memiliki kata sandi di tempat pertama.

Eric Leschinski
sumber
+1 tapi saya pikir Anda menyatakan dengan jelas apa masalahnya dengan pendekatan ini.
anubhava
5

Anda dapat menggunakan sshpass untuk itu. Berikut langkah-langkahnya

  1. Instal sshpass Untuk Ubuntu - sudo apt-get install sshpass
  2. Tambahkan Remote IP ke file host-dikenal Anda jika ini pertama kali Untuk Ubuntu -> ssh user @ IP -> masukkan 'yes'
  3. berikan perintah gabungan dari scp dan sshpass untuk itu. Di bawah ini adalah contoh kode untuk perang melawan tomcat jarak jauh sshpass -p '#Password_For_remote_machine' scp /home/ubuntu/latest_build/abc.war #user@#RemoteIP:/var/lib/tomcat7/webapps
ravi ranjan
sumber