Sftp komutu Bash betiğinden bir parola ile nasıl çalıştırılır?


173

Bir Linux ana bilgisayardan sftp kullanarak uzak bir ana bilgisayara bir günlük dosyası aktarmak gerekiyor . Aynı şey için operasyon grubumdan kimlik bilgileri sağlandı. Ancak, diğer ana bilgisayar üzerinde denetime sahip olmadığım için, RSA anahtarlarını diğer ana bilgisayarla oluşturup paylaşamıyorum.

sftpBash komutunun içinden bir cron işi aracılığıyla komutu çalıştırmanın bir yolu var mı (kullanıcı adı / parola sağlanmışsa) ?

Benzer bir Yığın Taşması sorusu buldum, Bash betiğinde sftp için parola belirtin , ancak sorunuma tatmin edici bir cevap yoktu.

Yanıtlar:


178

Ortak anahtar kimlik doğrulaması kullanmak dışında birkaç seçeneğiniz vardır:

  1. Anahtarlık kullanın
  2. Sshpass kullanın (daha az güvenli ancak muhtemelen gereksiniminizi karşılar)
  3. Kullanım bekliyoruz (en güvenli ve daha gerekli kodlama)

Eğer sshpass'a bir şans vermeye karar verirseniz, burada çalışan bir komut dosyası snippet'idir:

export SSHPASS=your-password-here
sshpass -e sftp -oBatchMode=no -b - sftp-user@remote-host << !
   cd incoming
   put your-log-file.log
   bye
!


18
İhracat yapmaya gerek yok sanırım. SSHPASS=password sshpass -e ...yapmak gerekir.
Jens

9
Bir günlük dosyasını indirmek için tek bir astar yapmayı başardım:sshpass -p "my_password" sftp -oPort=9999 user@host:dir/file.log
Cloud Artisans

6
@gorus: Tek astar çok havalı ama gelişmiş gözetleme riskleri nedeniyle komut satırında şifre kullanmak istemedim.
anubhava

8
-oBatchMode=nobenim için en önemli eksik parçaydı.
richardkmiller

99

Başka bir yol lftp kullanmak olacaktır:

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

Bu yöntemin dezavantajı, bilgisayardaki diğer kullanıcıların parola gibi araçlardan okuyabilmeleri ve parolanın pskabuk geçmişinizin bir parçası olabilmesidir.

LFTP 4.5.0, LFTP_PASSWORDortam değişkenini ayarlamak ve lftp'yi çalıştırmak olduğundan daha güvenli bir alternatiftir --env-password. İşte tam bir örnek:

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

LFTP ayrıca harika bir yansıtma özelliği de içerir (onaylandıktan sonra silme işlemini içerebilir --Remove-source-files):

lftp -e 'mirror -R /local/log/path/ /remote/path/' --env-password -u user sftp.foo.com

9
Alternatif önermek için +1, ancak komut satırında şifre vermekten kaçınabilir miyiz?
anubhava

1
Şifreyi aynı bilgisayardaki herkese göstermek için
indirildi

10
Lftp için komut dosyası oluşturabilirsiniz, bu şekilde komut satırında parolayı girmeniz gerekmez. Dosya oluşturma put-script: open sftp://user:password@host; put local-file.name; exit Çalıştırılacak lftp -f put-script yol Bu şekilde, kullanıcı adının ve parolanın bir komut satırında bulunması gerekmez ve komut dosyanız için kısıtlayıcı izinler ayarlayabilirsiniz.
obaranovsky

@obaranovsky Bu iyi bir fikir. Bunu ortam değişkenime takma ad veya işlev olarak ekleyip eklemeyeceğimi merak ediyorum, diğer kullanıcılardan gizlemek güvenli ve mümkün mü?
sdkks

1
Yapmak çok daha kolay lftpetrafında karışıklık daha sftpve sshpass. İyi cevap.
MeanEYE

53

Expect kullanmak için harika bir program.

Ubuntu'da şu şekilde yükleyin:

sudo apt-get install expect

Bir CentOS Makinesinde aşağıdakileri kurun:

yum install expect

Bir sftp sunucusuna bağlantı kurmak ve ardından yerel makinenizden uzak sftp sunucusuna yerel bir dosya yüklemek istediğinizi varsayalım

#!/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

Bu, sunucuya şifrenizle bir sftp bağlantısı açar.

Sonra dosyanızı yüklemek istediğiniz dizine gider, bu durumda "logdirectory"

Bu, / var / log / dizininde bulunan yerel dizinden dosya.log dosya adıyla bir günlük dosyasını uzak sunucudaki "günlük dizinine" yükler


Cevabınız için teşekkürler, bu görevi yerine getirme seçeneklerimden birini bekliyordum.
anubhava

Teşekkür ederim. Cevabınızı bir arama yoluyla buldum, kullandım ve beklemeyle başarılı bir şekilde bir senaryo oluşturdum. Sadece poterity için senaryo yayınladı
rezizter

Cevabınız için çok teşekkür ederim, zaten iptal ettim :)
anubhava

Bunu ssh özel anahtarının parolasını girmek için kullanıyorum. Tüm sunuculara aynı ortak anahtarı koymak ve özel anahtar parolasını periyodik olarak döndürmek daha kolaydır.
sdkks

24

Aşağıdakileri yaparak parolanın .bash_history veya benzeri sürümlere kaydedilmemesi için lftp'yi bir kabuk komut dosyasında etkileşimli olarak kullanabilirsiniz:

vi test_script.sh

Dosyanıza aşağıdakileri ekleyin:

#!/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

Ve koymak dosya yazmanız için ana bilgisayar, kullanıcı, geçiş ve dizini düzenledikten sonra vi düzenleyicisini yazın / çıkın. Daha sonra :wqkomut dosyanızı yürütülebilir yapın chmod +x test_script.shve çalıştırın ./test_script.sh.


2
Mevcut dosyanın üzerine yazmak için, lftp'den sonra "set xfer: clobber on" ifadesini ekleyin << END_SCRIPT
Balaji Natarajan

17

Son zamanlarda sunucular arasında dosya aktarımını sağlamak için ftp'den sftp'ye geçmem istendi. Bir seçeneği olan Tectia SSH paketini kullanıyoruz--passwordŞifreyi komut satırına geçirme .

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

Parti örneği:

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

Yardım komutunu ( sftp -h) çalıştırmadan önce çeşitli web sitelerine baktığım için bu bilgiyi paylaşmam gerektiğini düşündüm ve şifre seçeneğini gördüğüme şaşırdım.


9
+1 sizin için iyi bir öneri. Ancak bu, parolayı komut satırına geçirmenizi gerektirir ve sistemde pskomut veren herkes parolanızı görebilir.
anubhava

4
Bunu denedim, aldımunknown 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
@ihue muhtemelen Techia SSH'ye ihtiyacınız olduğu için OpenSSH'ye değil
qris

17

Şifre az kimlik doğrulamasını etkinleştirerek geçersiz kılabilirsiniz. Ancak bunun için anahtarları (pub, priv) yüklemelisiniz.

Yerel sunucuda aşağıdaki komutları yürütün.

Local $> ssh-keygen -t rsa 

İstenen tüm seçenekler için ENTER tuşuna basın. Hiçbir değerin yazılmasına gerek yoktur.

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

Aşağıdaki komutu kullanarak uzak sunucuya bağlanın

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

Uzak sunucuda aşağıdaki komutları yürütün

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

Parolasız kimlik doğrulamasını sınamak için yerel sunucuda aşağıdaki komutu yürütün. Parola olmadan bağlanmalıdır.

$> ssh user@targetmachine

1
Cevabınız için +1, ancak soru genel / özel anahtarlar olmadan yapmakla ilgiliydi.
anubhava

ayy .. Anahtar paylaşımı ile ilgili kısıtlamaları gördüm :)
SriniV

Meraktan bu komut lftp -p ${port} -u ${login_id},${password} ${ip_number}bir kabuk komut dosyasından çağrıldığında bazı yerlerde onları yazdıracak mı? Sshpass dışında nasıl çözdünüz?
SriniV

Her ikisinde de Mac ve Linux'a lftpgüvenmiyorum sshpass.
anubhava

Saf altın. Teşekkürler! :)
Nikolay Tsenkov

7

Sshpass'ı kilitli bir kimlik bilgileri dosyasıyla birleştirin ve pratikte her şey kadar güvenlidir - kimlik bilgileri dosyasını okumak için kutuda kök varsa, tüm bahisler yine de kapalıdır.


5

Sftp'nin bir şifre istemesini beklemek için Bash programı ve ardından gönderin:

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

Beklentiyi yüklemeniz, isteminizin aldığı mesajla eşleşmesi için 'Şifre' ifadesini küçük harfle 'p' olarak değiştirmeniz gerekebilir. Buradaki sorunlar, parolanızı dosyada ve komut geçmişinde düz metin olarak göstermesidir. Hangi neredeyse bir parola sahip olma amacını yener.


+1 ama bence bu yaklaşımdaki sorunların ne olduğunu açıkça belirtiyorsunuz.
anubhava

5

Bunun için sshpass kullanabilirsiniz. Aşağıda adımlar

  1. Ubuntu için sshpass yükleyin - sudo apt-get install sshpass
  2. Uzak IP'yi ilk kez bilinen ana bilgisayar dosyanıza ekleyin Ubuntu -> ssh kullanıcısı @ IP -> 'evet'i girin
  3. bunun için birleşik scp ve sshpass komutu verin. Aşağıda uzak tomcat'e savaş ile başa çıkmak için örnek bir kod verilmiştir sshpass -p '#Password_For_remote_machine' scp /home/ubuntu/latest_build/abc.war #user@#RemoteIP:/var/lib/tomcat7/webapps
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.