SCP'ye şifre nasıl aktarılır?


298

Tavsiye edilmediğini biliyorum, ancak scp için kullanıcının şifresini geçmek mümkün mü?

Bir toplu işin parçası olarak bir dosyayı scp ile kopyalamak istiyorum ve alıcı sunucu elbette bir parolaya ihtiyaç duyuyor ve hayır, bunu kolayca anahtar tabanlı kimlik doğrulamasına değiştiremiyorum.


2
Ayrıca (daha sonra) soruya da bakınız: stackoverflow.com/questions/1462284/… burada bir yanıtın bunu yapmanın başka bir yolundan bahsedilmesi. (Not: Bu yinelenen bir soru değildir - diğerlerinin yinelediği orijinaldir.)
Jonathan Leffler

Yanıtlar:


35

Sen gibi bir aletle komut onu can beklediğinin (kullanışlı bağlamaları gibi, çok vardır pexpect Python için).


1
Wait.nist.gov bağlantısı kesildi. Belki de bu ?: beklemek.sourceforge.net
Katapofatico

sudo uygun-almak yüklemek bekliyoruz
SDsolar

>> demlemek info sshpass Hata: "sshpass" adında kullanılabilir bir formül yok sshpass eklemeyeceğiz çünkü acemi SSH kullanıcılarının SSH'nin güvenliğini mahvetmesini kolaylaştırıyor. ;)
Lukas NP Egger

528

Sshpass kullanın :

sshpass -p "password" scp -r user@example.com:/some/remote/path /some/local/path

ya da böylece parola bash geçmişinde gösterilmez

sshpass -f "/path/to/passwordfile" scp -r user@example.com:/some/remote/path /some/local/path

Yukarıdaki yolun yolunu uzak ana bilgisayardan yerel sunucunuza kopyalar.

Yüklemek :

  • ubuntu / debian
    • apt install sshpass
  • centos / fötr şapka
    • yum install sshpass
  • mac ile mac mac
    • port install sshpass
  • demleme mac
    • brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb

14
Ubuntu 12.04'te sadece benim için şifre üzerinde tek tırnak işareti ile çalıştı (örneğin "şifre" yerine "şifre").
odedfos

6
@odedfos, evet, tek tırnak kullanmanız gerekir, çünkü parola ile oluşturulan bazı karakterlerin çift tırnaklı dize enterpolasyonunda özel bir yorumu olabilir
TerryE

7
Sshpassapt-get install sshpass
Jan-Terje Sørensen

6
CentOS üzerinde bu kadaryum -y install sshpass
jgritty

19
Bunu yapmanın en güvenli yolu şunun gibi bir şifre dosyasıdır : sshpass -f passwdfile` scp [...] . This way, the password won't show up in ps` listeleri vb. Ve şifreyi dosya izinleriyle koruyabilirsiniz.
Christopher Schultz

50

sadece aşağıdaki gibi bir ssh anahtarı oluşturun:

ssh-keygen -t rsa -C "your_email@youremail.com"

içeriğini kopyalayın ~/.ssh/id_rsa.pub ve son olarak uzak makinelere ekleyin~/.ssh/authorized_keys

uzak makinenin izinlere sahip olduğundan emin olun 0700 for ~./ssh folderve0600 for ~/.ssh/authorized_keys


35
Yazdığım gibi: Hayır, kolayca anahtar tabanlı kimlik doğrulamasına geçemiyorum.
Argelbargel

3
Şunu mu demek istediniz: .authorized_keys. authorization_keys?
HelloWorld

2
Bunun için geçerli bir kullanım, kullanıcıdan uzak sunucunun parolasını sormak istediğiniz bir sunucuya birden fazla scp / ssh çağrısı yapan bir bash betiğidir. Parola daha sonra geçmişte gösterilmez ve yine de parola için meydan okumaya hazır olursunuz ... ama sadece bir kez. Komut dosyası kullanıcısının kimliğini doğrulamak istediğim için bir anahtar dosyası kullanmak istemiyorum.
Wes Grant

2
Başka bir geçerli kullanım, hedefte anahtar tabanlı kimlik doğrulamayı kolayca etkinleştirememeniz olabilir. Örnek: Ana NAS üreticilerinden biri - DSM 6.0'larıyla Synology - 2016'da bile desteklemiyor. Elbette, yapılandırma dosyalarıyla uğraşabilirsiniz ve bir güncellemenin tekrar üzerine yazılmayacağını umabilirsiniz (DSM'yi güncellemek sık sık özel değişiklikleri bozar ). Bazen - özellikle OP açıkça yazdığında, bunun optimal olmadığını biliyorlar - insanların sadece bir çözüme ihtiyaçları var.
Aaa

3
ssh-copy-id -i ~/.ssh/id_rsa.pub <remote_server>Anahtarı uzak sunucuya kopyalamak için kullanmalısınız
RousseauAlexandre

40

Sunucuya Windows üzerinden bağlanıyorsanız, scp'nin ("pscp") Putty sürümü parolayı -pwparametreyle geçirmenizi sağlar .

Buradaki belgelerde bu belirtilmiştir.


1
Bir örnek gösterin lütfen.
SDsolar

Ayrıca, bu komutları kullanmak için yolunuza C: \ Program Files (x86) \ PuTTY eklemek isteyebilirsiniz.
SDsolar

1
@SDsolar İşte bir sözdizimi örneği: pscp -pw 'MyPa$$word' username@servername:/somedir/somefile ~/somedest( Macunu böyle kullanmaktan nefret ediyorum, ama işe yarıyor)
geneorama

29

curl, bir dosyayı kopyalamak için scp'ye alternatif olarak kullanılabilir ve komut satırında bir parolayı destekler.

curl --insecure --user username:password -T /path/to/sourcefile sftp://desthost/path/

'Scp' den oldukça yavaş ama işi iyi yapıyor.
Victor

Hedef büyük bir şifre istemi gecikmesi ile yapılandırıldığında bunu daha hızlı buldum. scpbir şifre girmeme izin vermek için 30+ saniye beklemek zorunda, ama curlhemen çalıştı.
Ghost8472

@ Ghost8472 evet yapılandırdı, ancak bazen bu gecikme ana bilgisayar adını çözüyor ve sftp için de oluyor.
mckenzm

1
"Curl: (1)" sftp "protokolü libcurl'de desteklenmiyor veya devre dışı bırakıldı"
kronuus

21

Unix / terminalde 'beklemek' komut dosyasını kullanabilirsiniz

Örneğin, 'test.exp' oluşturun:

#!/usr/bin/expect
        spawn scp  /usr/bin/file.txt root@<ServerLocation>:/home
        set pass "Your_Password"
        expect {
        password: {send "$pass\r"; exp_continue}
                  }

komut dosyasını çalıştır

expect test.exp 

Umarım bu yardımcı olur.


7
Önkoşul: sudo uygun-almak kurulum bekliyoruz
SDsolar

10

Aracıyla nasıl yaptığınıza ilişkin bir örnek expect:

sub copyover {
    $scp=Expect->spawn("/usr/bin/scp ${srcpath}/$file $who:${destpath}
+/$file");
    $scp->expect(30,"ssword: ") || die "Never got password prompt from
+ $dest:$!\n";
    print $scp 'password' . "\n";
    $scp->expect(30,"-re",'$\s') || die "Never got prompt from parent 
+system:$!\n";
    $scp->soft_close();
    return;
}

2
Bu perl, üzgünüm bunu yazmadım. (5 yıl önce :))
Espo


3

ssh-copy-idSsh anahtarı eklemek için kullanabilirsiniz :

$which ssh-copy-id #check whether it exists

Varsa:

ssh-copy-id  "user@remote-system"

3

ssh-keygenYukarıda açıklandığı gibi ayarladıktan sonra ,

scp -i ~/.ssh/id_rsa /local/path/to/file remote@ip.com:/path/in/remote/server/

Her seferinde yazmayı azaltmak istiyorsanız, .bash_profiledosyanızı değiştirebilir ve

alias remote_scp='scp -i ~/.ssh/id_rsa /local/path/to/file remote@ip.com:/path/in/remote/server/

Sonra terminalden yapın source ~/.bash_profile. Daha sonra remote_scpterminalinizi yazarsanız , scpkomutu şifresiz çalıştırması gerekir .


2
  1. önce "bekle" aracına sahip olduğunuzdan emin olun, eğer değilse, yapın

    # apt-get install expect

  2. Aşağıdaki içeriğe sahip bir komut dosyası oluşturun. (# vi / root / scriptfile)

    spawn scp /path_from/file_name user_name_here@to_host_name:/path_to

    expect "password:"

    send put_password_here\n;

    interact

  3. komut dosyası dosyasını "beklemek" aracıyla yürütmek

    # expect /root/scriptfile


1

İşte bu blog yayınına dayanan fakir bir adamın Linux / Python / Expect benzeri örneği: Basit kabukları tam etkileşimli TTY'lere yükseltme . Python'a Expect veya modül ekleyemediğim eski makineler için buna ihtiyacım vardı.

Kod:

(
    echo 'scp jmudd@mysite.com:./install.sh .'
    sleep 5
    echo 'scp-passwd'
    sleep 5
    echo 'exit'
) |

python -c 'import pty; pty.spawn("/usr/bin/bash")'

Çıktı:

scp jmudd@mysite.com:install.sh .
bash-4.2$ scp jmudd@mysite.com:install.sh .
Password: 
install.sh                                 100%   15KB 236.2KB/s   00:00    
bash-4.2$ exit
exit

0

Alternatif olarak, kullanıcı anahtarının ortak yarısını hedef sistemdeki yetkili anahtarlar dosyasına ekleyebilirsiniz. Aktarımı başlattığınız sistemde, bir ssh-agent arka plan programı çalıştırabilir ve anahtarın özel yarısını aracıya ekleyebilirsiniz. Daha sonra toplu iş, anahtarın parolasını sormak yerine özel anahtarı almak için aracıyı kullanacak şekilde yapılandırılabilir.

Bu, bir UNIX / Linux sisteminde veya pageant ve pscp kullanarak Windows platformunda yapılabilmelidir.


4
Soru, anahtar tabanlı kimlik doğrulamayı kullanamayacağını söyledi.
Barmar

2
Ayrıca, ben olsaydım, diğer sunucuyu değiştiremediğimi varsayıyorum - tek istediğim bir dosyayı kopyalamak.
SDsolar

-1

Yukarıda belirtilen tüm çözümler yalnızca uygulama yüklüyse veya sshpass dışında yüklenecek yönetici haklarına sahip olmanız durumunda çalışabilir.

Ben scp arka planda başlatmak için bu çok yararlı bir bağlantı buldum.

$ nohup scp file_to_copy user@server:/path/to/copy/the/file > nohup.out 2>&1

https://charmyin.github.io/scp/2014/10/07/run-scp-in-background/


1
Nasıl scp arka planda çalışan şifre girdi?
thomas.han


-9

Burada gerçekten yararlı bir cevap buldum .

rsync -r -v --progress -e ssh user@remote-system:/address/to/remote/file /home/user/

Sadece şifreyi oraya veremezsiniz, aynı zamanda kopyalama sırasında ilerleme çubuğunu da gösterir. Gerçekten harika.


22
ve burada tam olarak nasıl şifre veriyorsunuz?
infografnet
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.