Làm thế nào để chạy lệnh sftp với mật khẩu từ tập lệnh Bash?


173

Tôi cần chuyển tệp nhật ký đến máy chủ từ xa bằng sftp từ máy chủ Linux. Tôi đã được cung cấp thông tin đăng nhập giống nhau từ nhóm hoạt động của mình. Tuy nhiên, vì tôi không có quyền kiểm soát máy chủ khác, tôi không thể tạo và chia sẻ khóa RSA với máy chủ khác.

Vậy có cách nào để chạy sftplệnh (với tên người dùng / mật khẩu được cung cấp) từ bên trong tập lệnh Bash thông qua một công việc định kỳ không?

Tôi đã tìm thấy một câu hỏi Stack Overflow tương tự, Chỉ định mật khẩu cho sftp trong tập lệnh Bash , nhưng không có câu trả lời thỏa đáng cho vấn đề của tôi.

Câu trả lời:


178

Bạn có một vài tùy chọn khác ngoài sử dụng xác thực khóa chung:

  1. Sử dụng móc khóa
  2. Sử dụng sshpass (ít bảo mật hơn nhưng có thể đáp ứng yêu cầu của bạn)
  3. Sử dụng kỳ vọng (ít bảo mật nhất và cần nhiều mã hóa hơn)

Nếu bạn quyết định cho sshpass một cơ hội thì đây là đoạn mã hoạt động để làm như vậy:

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

3
Để sử dụng nó trên Mac: stackoverflow.com/questions/9102557/ từ
anubhava

18
Không cần phải xuất khẩu, tôi nghĩ. SSHPASS=password sshpass -e ...nên làm.
Jens

9
Tôi đã có thể thực hiện một lớp lót để tải xuống tệp nhật ký:sshpass -p "my_password" sftp -oPort=9999 user@host:dir/file.log
Cloud Artisans

6
@gorus: One-liner rất tuyệt tuy nhiên tôi không muốn sử dụng mật khẩu trên dòng lệnh vì rủi ro rình mò tăng cường.
anubhava

8
-oBatchMode=nolà phần còn thiếu quan trọng đối với tôi.
richardkmiller

98

Một cách khác là sử dụng lftp:

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

Nhược điểm của phương pháp này là những người dùng khác trên máy tính có thể đọc mật khẩu từ các công cụ như psvà mật khẩu có thể trở thành một phần trong lịch sử trình bao của bạn.

Một sự thay thế an toàn hơn có sẵn kể từ khi LFTP 4.5.0 đang thiết lập LFTP_PASSWORDbiến môi trường và thực thi lftp với --env-password. Đây là một ví dụ đầy đủ:

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

LFTP cũng bao gồm một tính năng phản chiếu thú vị (có thể bao gồm xóa sau khi chuyển được xác nhận --Remove-source-files):

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

9
+1 để đề xuất một giải pháp thay thế nhưng chúng ta có thể tránh việc cung cấp mật khẩu trên dòng lệnh không?
anubhava

1
Bị hạ cấp vì hiển thị mật khẩu cho bất kỳ ai trên cùng một máy tính
Aaron Digulla

10
Bạn có thể tạo tệp script cho lftp, bằng cách này bạn sẽ không phải cung cấp mật khẩu trong dòng lệnh. Tạo một tệp put-script: open sftp://user:password@host; put local-file.name; exit Hơn chạy lftp -f put-script Theo cách này, bạn không cần phải có tên người dùng và mật khẩu trong một dòng lệnh và có thể thiết lập quyền hạn chế đối với tệp tập lệnh của mình.
obaranovsky

@obaranovsky Đó là một ý tưởng tốt. Tôi tự hỏi nếu tôi thêm nó vào biến môi trường của mình dưới dạng bí danh hoặc hàm, liệu nó có an toàn và có thể ẩn nó khỏi những người dùng khác không?
sdkks

1
Dễ dàng để làm lftphơn là lộn xộn với sftpsshpass. Câu trả lời tốt.
MeanEYE

53

Mong đợi là một chương trình tuyệt vời để sử dụng.

Trên Ubuntu cài đặt nó với:

sudo apt-get install expect

Trên máy CentOS cài đặt nó với:

yum install expect

Hãy nói rằng bạn muốn tạo kết nối đến máy chủ sftp và sau đó tải tệp cục bộ từ máy cục bộ của bạn lên máy chủ sftp từ xa

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

Điều này sẽ mở một kết nối sftp với mật khẩu của bạn đến máy chủ.

Sau đó, nó đi đến thư mục mà bạn muốn tải lên tệp của mình, trong trường hợp này là "logdirectory"

Điều này tải lên một tệp nhật ký từ thư mục cục bộ được tìm thấy tại / var / log / với tên tệp là file.log vào "logdirectory" trên máy chủ từ xa


Cảm ơn câu trả lời của bạn, tôi đã mong đợi là một trong những lựa chọn của tôi để đạt được nhiệm vụ này.
anubhava

Cảm ơn bạn. Tôi tìm thấy câu trả lời của bạn thông qua một tìm kiếm, sử dụng nó và xây dựng một kịch bản thành công với mong đợi. Chỉ cần đăng kịch bản cho poterity
rezizter

Cảm ơn bạn rất nhiều vì bạn đã trả lời, tôi đã nâng cấp nó :)
anubhava

Tôi đang sử dụng điều này để nhập cụm mật khẩu cho khóa riêng ssh. Sẽ dễ dàng hơn khi đặt cùng một khóa công khai trên tất cả các máy chủ và chỉ cần xoay cụm mật khẩu khóa riêng theo định kỳ.
sdkks

24

Bạn có thể sử dụng lftp tương tác trong tập lệnh shell để mật khẩu không được lưu trong .bash_history hoặc tương tự bằng cách thực hiện như sau:

vi test_script.sh

Thêm phần sau vào tập tin của bạn:

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

Và viết / thoát trình soạn thảo vi sau khi bạn chỉnh sửa máy chủ, người dùng, mật khẩu và thư mục để nhập tệp tin. :wqSau đó, hãy tạo tập lệnh của bạn để thực thi chmod +x test_script.shvà thực thi nó ./test_script.sh.


2
Để ghi đè tệp hiện có, hãy thêm "set xfer: clobber on" sau lftp << END_SCRIPT
Balaji Natarajan

17

Gần đây tôi đã được yêu cầu chuyển từ ftp sang sftp, để bảo đảm việc truyền tệp giữa các máy chủ. Chúng tôi đang sử dụng gói Tectia SSH, có tùy chọn --passwordtruyền mật khẩu trên dòng lệnh.

thí dụ : sftp --password="password" "userid"@"servername"

Ví dụ hàng loạt:

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

Tôi nghĩ rằng tôi nên chia sẻ thông tin này, vì tôi đã xem các trang web khác nhau, trước khi chạy lệnh trợ giúp ( sftp -h) và tôi rất ngạc nhiên khi thấy tùy chọn mật khẩu.


9
+1 cho bạn đề xuất tốt. Tuy nhiên, điều này sẽ yêu cầu bạn chuyển mật khẩu trên dòng lệnh và bất kỳ ai trên hệ thống đang thực hiện pslệnh sẽ có thể thấy mật khẩu của bạn.
anubhava

4
Tôi đã thử điều đó, tôi đã nhận đượcunknown 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 có lẽ vì bạn cần Techia SSH , không phải OpenSSH
qris 22/03/18

17

Bạn có thể ghi đè bằng cách bật Mật khẩu xác thực ít hơn. Nhưng bạn nên cài đặt khóa (pub, private) trước khi đi.

Thực hiện các lệnh sau tại máy chủ cục bộ.

Local $> ssh-keygen -t rsa 

Nhấn ENTER cho tất cả các tùy chọn được nhắc. Không có giá trị cần phải gõ.

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

Kết nối với máy chủ từ xa bằng lệnh sau

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

Thực hiện các lệnh sau tại máy chủ từ xa

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

Thực hiện lệnh sau tại máy chủ cục bộ để kiểm tra xác thực không cần mật khẩu. Nó nên được kết nối mà không cần mật khẩu.

$> ssh user@targetmachine

1
+1 cho câu trả lời của bạn nhưng câu hỏi là về việc thực hiện nó mà không có khóa chung / riêng.
anubhava

Rất tiếc .. Chỉ thấy các hạn chế về chia sẻ khóa :)
SriniV

Vì tò mò, lệnh này sẽ lftp -p ${port} -u ${login_id},${password} ${ip_number}được gọi từ tập lệnh shell in chúng ở đâu? Làm thế nào bạn giải quyết ngoài sshpass?
SriniV

Tôi không có lftpvà dựa vào cả sshpassMac và Linux.
anubhava

Vàng nguyên chất. Cảm ơn! :)
Nikolay Tsenkov 13/03/2015

7

Kết hợp sshpass với tệp thông tin xác thực bị khóa và trên thực tế, nó an toàn như mọi thứ - nếu bạn đã root trên hộp để đọc tệp thông tin đăng nhập, tất cả các cược đều bị tắt.


5

Chương trình Bash để chờ sftp hỏi mật khẩu rồi gửi mật khẩu:

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

Bạn có thể cần cài đặt kỳ vọng, thay đổi từ ngữ của 'Mật khẩu' thành chữ thường 'p' để khớp với những gì lời nhắc của bạn nhận được. Vấn đề ở đây là nó làm lộ mật khẩu của bạn dưới dạng văn bản đơn giản trong tệp cũng như trong lịch sử lệnh. Mà gần như đánh bại mục đích có mật khẩu ở nơi đầu tiên.


+1 nhưng tôi nghĩ bạn nói rõ vấn đề là gì với cách tiếp cận này.
anubhava

5

Bạn có thể sử dụng sshpass cho nó. Dưới đây là các bước

  1. Cài đặt sshpass cho Ubuntu - sudo apt-get install sshpass
  2. Thêm IP từ xa vào tệp máy chủ đã biết của bạn nếu đây là lần đầu tiên đối với Ubuntu -> người dùng ssh @ IP -> nhập 'có'
  3. đưa ra một lệnh kết hợp của scp và sshpass cho nó. Dưới đây là một mã mẫu để đối phó với chiến tranh với tomcat từ xa sshpass -p '#Password_For_remote_machine' scp /home/ubuntu/latest_build/abc.war #user@#RemoteIP:/var/lib/tomcat7/webapps
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.