Làm thế nào để truyền mật khẩu cho scp?


297

Tôi biết điều đó không được khuyến khích, nhưng liệu có thể truyền mật khẩu của người dùng cho scp không?

Tôi muốn sao chép một tập tin qua scp như một phần của một công việc hàng loạt và máy chủ nhận, tất nhiên, cần một mật khẩu và, không, tôi không thể dễ dàng thay đổi nó thành xác thực dựa trên khóa.


2
Xem thêm (sau) câu hỏi: stackoverflow.com/questions/1462284/ , trong đó một câu trả lời đề cập đến một cách khác có thể để làm điều này. (NB: đây không phải là một câu hỏi trùng lặp - đó là bản gốc mà các bản sao khác trùng lặp.)
Jonathan Leffler

Câu trả lời:


35

Bạn có thể viết kịch bản với một công cụ như mong đợi (cũng có các ràng buộc tiện dụng, như PExect cho Python).


1
Liên kết đến mong đợi.nist.gov bị hỏng. Có lẽ đây?: Wish.sourceforge.net
Katapofatico

sudo apt-get cài đặt mong đợi
SDsolar

>> brew thông tin sshpass Lỗi: Không có công thức có sẵn với tên "sshpass" Chúng tôi sẽ không thêm sshpass vì nó quá dễ dàng cho người dùng SSH mới làm hỏng bảo mật của SSH. ;)
Lukas NP Egger

528

Sử dụng sshpass :

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

hoặc vì vậy mật khẩu không hiển thị trong lịch sử bash

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

Các bản sao trên nội dung của đường dẫn từ máy chủ từ xa đến địa phương của bạn.

Tải về :

  • Ubuntu / debian
    • apt install sshpass
  • centos / fedora
    • yum install sshpass
  • mac w / macports
    • port install sshpass
  • mac w / bia
    • brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb

14
Trên Ubuntu 12.04, nó chỉ hoạt động với tôi với các trích dẫn duy nhất về mật khẩu (ví dụ: 'mật khẩu' thay vì "mật khẩu").
odedfos

6
@odingfos, vâng, bạn cần sử dụng dấu ngoặc đơn vì một số ký tự được tạo bằng mật khẩu có thể có một cách hiểu đặc biệt trong phép nội suy chuỗi được trích dẫn kép
TerryE

7
Đây là cách bạn cài đặt sshpassapt-get install sshpass
Jan-Terje Sørensen

6
Trên CentOS, nóyum -y install sshpass
jgritty

19
Cách an toàn nhất để thực hiện việc này là với một tệp mật khẩu , như thế này: sshpass -f passwdfile` scp [...] . This way, the password won't show up in danh sách ps`, v.v. và bạn có thể bảo vệ mật khẩu bằng quyền truy cập tệp.
Christopher Schultz

50

chỉ cần tạo khóa ssh như:

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

sao chép nội dung ~/.ssh/id_rsa.pub và cuối cùng thêm nó vào các máy từ xa~/.ssh/authorized_keys

đảm bảo máy từ xa có quyền 0700 for ~./ssh folder0600 for ~/.ssh/authorized_keys


35
Như tôi đã viết: Không, tôi không thể dễ dàng chuyển sang xác thực dựa trên khóa.
Argelbargel

3
Bạn có nghĩa là. Trái_key chứ không phải. ủy quyền?
HelloWorld

2
Việc sử dụng hợp lệ cho điều này sẽ là một tập lệnh bash thực hiện nhiều cuộc gọi scp / ssh đến một máy chủ nơi bạn muốn hỏi người dùng mật khẩu cho máy chủ từ xa. Mật khẩu sau đó sẽ không hiển thị trong lịch sử và bạn vẫn có thể thử thách mật khẩu ... nhưng chỉ một lần. Tôi không muốn sử dụng tệp chính vì tôi vẫn muốn xác thực người dùng tập lệnh.
Wes Grant

2
Một cách sử dụng hợp lệ khác là nếu bạn không thể dễ dàng kích hoạt xác thực dựa trên khóa trên mục tiêu. Ví dụ: Một trong những nhà sản xuất NAS chính - Synology với DSM 6.0 của họ - không hỗ trợ nó ngay cả trong năm 2016. Chắc chắn, bạn có thể gây rối với các tệp cấu hình và hy vọng bản cập nhật sẽ không ghi đè lại (cập nhật DSM thường xuyên phá vỡ các sửa đổi tùy chỉnh ). Đôi khi - đặc biệt là khi OP viết rõ ràng họ đã biết rằng nó không tối ưu - mọi người chỉ cần một giải pháp.
Aaa

3
Bạn nên sử dụng ssh-copy-id -i ~/.ssh/id_rsa.pub <remote_server>để sao chép khóa trên máy chủ từ xa
RousseauAlexandre

39

Nếu bạn đang kết nối với máy chủ từ Windows, phiên bản Putty của scp ("pscp") cho phép bạn chuyển mật khẩu với -pwtham số.

Điều này được đề cập trong các tài liệu ở đây.


1
Vui lòng cho một ví dụ.
SDsolar

Ngoài ra, có thể muốn thêm C: \ Program Files (x86) \ PuTTY vào đường dẫn của bạn để sử dụng các lệnh này.
SDsolar

1
@SDsolar đây là một ví dụ cú pháp: pscp -pw 'MyPa$$word' username@servername:/somedir/somefile ~/somedest(Tôi ghét sử dụng putty như thế này, nhưng nó hoạt động)
genorama

29

curl có thể được sử dụng như là một thay thế cho scp để sao chép một tập tin và nó hỗ trợ mật khẩu trên dòng lệnh.

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

Nó khá chậm hơn 'scp' nhưng nó hoạt động tốt.
Victor

Tôi thấy điều này sẽ nhanh hơn khi đích được cấu hình với độ trễ nhắc mật khẩu lớn. scpphải chờ hơn 30 giây để cho tôi nhập mật khẩu, nhưng curlđã hoạt động ngay lập tức.
Ghost8472

@ Ghost8472 được định cấu hình có, nhưng đôi khi sự chậm trễ này đang giải quyết tên máy chủ và cũng xảy ra đối với sftp.
mckenzm

1
Tôi đã nhận được "curl: (1) Giao thức" sftp "không được hỗ trợ hoặc vô hiệu hóa trong libcurl"
kronuus

21

Bạn có thể sử dụng tập lệnh 'mong đợi' trên unix / terminal

Ví dụ: tạo 'test.bao':

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

chạy kịch bản

expect test.exp 

Tôi hy vọng điều đó sẽ giúp.


7
Điều kiện tiên quyết: mong đợi cài đặt sudo apt-get
SDsolar

10

Dưới đây là một ví dụ về cách bạn làm điều đó với expectcông cụ:

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
Đây là trong perl, xin lỗi tôi đã không viết điều đó. (5 năm trước :))
Espo


3

Bạn có thể sử dụng ssh-copy-idđể thêm khóa ssh:

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

Nếu tồn tại:

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

3

Khi bạn thiết lập ssh-keygennhư đã giải thích ở trên, bạn có thể làm

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

Nếu bạn muốn giảm bớt việc gõ mỗi lần, bạn có thể sửa đổi .bash_profiletệp của mình và đặt

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

Sau đó, từ thiết bị đầu cuối của bạn làm source ~/.bash_profile. Sau đó, nếu bạn gõ remote_scpvào terminal, nó sẽ chạy scplệnh mà không cần mật khẩu.


2
  1. đảm bảo bạn có công cụ "mong đợi" trước, nếu không, hãy làm nó

    # apt-get install expect

  2. tạo một tập tin script với nội dung sau đây. (# 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. thực hiện tập tin tập lệnh với công cụ "mong đợi"

    # expect /root/scriptfile


1

Đây là ví dụ giống Linux / Python / Expect của một người nghèo dựa trên bài đăng trên blog này: Nâng cấp các shell đơn giản lên TTY tương tác đầy đủ . Tôi cần điều này cho các máy cũ, nơi tôi không thể cài đặt Expect hoặc thêm các mô-đun vào Python.

Mã số:

(
    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")'

Đầu ra:

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

Một cách khác là thêm một nửa khóa công khai vào tệp khóa được ủy quyền trên hệ thống đích. Trên hệ thống bạn đang bắt đầu chuyển từ, bạn có thể chạy trình nền ssh-agent và thêm một nửa khóa riêng cho tác nhân. Công việc hàng loạt sau đó có thể được cấu hình để sử dụng tác nhân để lấy khóa riêng, thay vì nhắc mật khẩu của khóa.

Điều này nên có thể thực hiện được trên hệ thống UNIX / Linux hoặc trên nền tảng Windows bằng cách sử dụng trang và pscp.


4
Câu hỏi cho biết anh không thể sử dụng xác thực dựa trên khóa.
Barmar

2
Ngoài ra, nếu là tôi, tôi cho rằng tôi không thể thay đổi máy chủ khác - tất cả những gì tôi muốn là sao chép một tệp.
SDsolar

-1

Tất cả các giải pháp được đề cập ở trên chỉ có thể hoạt động nếu bạn cài đặt ứng dụng hoặc bạn nên có quyền quản trị để cài đặt ngoại trừ hoặc sshpass.

Tôi tìm thấy liên kết rất hữu ích này để chỉ cần bắt đầu scp trong Nền.

$ 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
Làm thế nào để chạy scp trong nền nhập mật khẩu ??
thomas.han

-3

các bước để có được sshpass Đối với rrc / centos 6:

# wget http://epel.mirror.net.in/epel/6/i386/epel-release-6-8.noarch.rpm
# rpm -ivh epel-release-6-8.noarch.rpm
# yum install sshpass

nguồn: https://community.mapr.com/thread/9040


-9

Tôi tìm thấy câu trả lời thực sự hữu ích ở đây .

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

Bạn không chỉ có thể chuyển mật khẩu mà còn hiển thị thanh tiến trình khi sao chép. Thực sự tuyệt vời.


22
và chính xác thì bạn đang cung cấp mật khẩu ở đây như thế nào?
infografnet
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.