Tự động chuyển tệp scp bằng cách sử dụng tập lệnh shell


83

Tôi có một số tệp n trong một thư mục trên hệ thống unix của tôi. Có cách nào để viết một shellcript sẽ chuyển tất cả các tệp đó qua scp đến một hệ thống từ xa được chỉ định không. Tôi sẽ chỉ định mật khẩu trong tập lệnh, để tôi không phải nhập mật khẩu cho mỗi tệp.


2
Bạn có thể vui lòng cho tôi biết nếu sử dụng mật khẩu trong shell script với rsync có hiệu quả không hoặc bạn đã thử chưa? cảm ơn.

Câu trả lời:


88

Thay vì mật khẩu mã hóa cứng trong tập lệnh shell, hãy sử dụng khóa SSH, dễ dàng hơn và an toàn hơn.

$ scp -i ~/.ssh/id_rsa *.derp devops@myserver.org:/path/to/target/directory/

giả sử khóa cá nhân của bạn được đặt tại ~/.ssh/id_rsavà các tệp bạn muốn gửi có thể được lọc bằng*.derp

Để tạo cặp khóa công khai / riêng tư:

$ ssh-keygen -t rsa

Ở trên sẽ tạo ra 2 tệp, ~/.ssh/id_rsa(khóa riêng tư) và ~/.ssh/id_rsa.pub(khóa công khai)

Để thiết lập các khóa SSH để sử dụng (tác vụ một lần): Sao chép nội dung của ~/.ssh/id_rsa.pubvà dán vào một dòng mới ~devops/.ssh/authorized_keystrong myserver.orgmáy chủ. Nếu ~devops/.ssh/authorized_keyskhông tồn tại, hãy thoải mái tạo nó.

Hướng dẫn cách làm rõ ràng có sẵn ở đây .


1
Ngay cả sau khi làm theo các hướng dẫn này, tôi vẫn được nhắc nhập mật khẩu ... có tiêu chí nào khác mà tôi đang thiếu không?
scottysseus,

@ScottScooterWeidenkopf có thể có một số điều có thể sai, như tệp .ssh dir hoặc các tệp allow_keys có thể không có quyền phù hợp (700).
Pradeep Pati

2
@PradeepPati Tôi đã tìm ra vấn đề của mình. Bạn nói đúng, vấn đề là quyền. Trong liên kết bạn cung cấp, tác giả đã đề cập đến một số thay đổi về quyền. Tôi đã thực hiện những thay đổi đó và bây giờ mọi thứ đều hoạt động.
scottysseus

1
Chỉ để giúp tránh nhầm lẫn với cách sử dụng sao chép-dán của giải pháp này, hiện tại câu trả lời này dường như chuyển từ từ xa sang cục bộ - điều này ngược lại với những gì OP đang tìm cách làm.
Ciabaros

@Ciabaros bắt tốt! Tôi đã cập nhật câu trả lời. cảm ơn!
Pradeep Pati

42
#!/usr/bin/expect -f

# connect via scp
spawn scp "user@example.com:/home/santhosh/file.dmp" /u01/dumps/file.dmp
#######################
expect {
  -re ".*es.*o.*" {
    exp_send "yes\r"
    exp_continue
  }
  -re ".*sword.*" {
    exp_send "PASSWORD\r"
  }
}
interact

http://blogs.oracle.com/SanthoshK/entry/automate_linux_scp_command


Lưu ý cho người dùng windows: Gói expecttrong MSYS2 sẽ khớp với toàn bộ kết quả đầu ra, vì vậy quy tắc 1 sẽ luôn khớp. Nếu bạn trao đổi thứ tự của cả hai quy tắc, bạn sẽ có được hành vi mong muốn.
fzbd

18

tại sao bạn không thử cái này?

password="your password"
username="username"
Ip="<IP>"
sshpass -p "$password" scp /<PATH>/final.txt $username@$Ip:/root/<PATH>

1
Tốt thay thế cho #! / Usr / bin /
hope

16

bạn cũng có thể sử dụng rsync. Nó có vẻ hoạt động tốt hơn cho nhiều tệp so với scp IMHO.

rsync -avzh / path / to / dir / user @ remote: / path / to / remote / dir /

Cập nhật

Bạn có thể sử dụng rsync qua ssh bằng cách thêm nút chuyển '-e':

rsync -avzh -e ssh / path / do / dir / user @ remote: / path / to / remote / dir /

3
Điều tốt đẹp về scp là nó sử dụng một kênh an toàn. rsync thì không.

3
Bạn có thể buộc rsync để sử dụng ssh: 'rsync -avz -e ssh remoteuser @ remotehost: / từ xa / dir / này / dir /'

@flokra. Cảm ơn, tôi đã đúng lúc thêm bản cập nhật đó và bị phân tâm.
bsisco

9
Thao tác này sẽ vẫn gọi một lời nhắc mật khẩu tương tác. Tôi tin rằng OP muốn có một giải pháp hoàn toàn tự động
Tom Auger

@Dimitri scp -r sao chép tệp một cách đệ quy. Nó không liên quan gì đến việc lưu trữ mật khẩu trong tập lệnh và chuyển nó tới lệnh gọi scp thông qua tập lệnh bash! Tôi không thực sự hiểu nhận xét của bạn.
Tom Auger

9
#!/usr/bin/expect -f
spawn scp -r BASE.zip abhishek@192.168.1.115:/tmp
expect "password:"
send "wifinetworks\r"
expect "*\r"
expect "\r"

Có thể mong đợi được sử dụng cho rsync? Tôi đang cố gắng làm điều gì đó và phương pháp khóa RSA của tôi không hoạt động. Nó liên tục hỏi tôi mật khẩu cho máy từ xa.

5

Còn ký tự đại diện hoặc nhiều tệp thì sao?

scp file1 file2 more-files* user@remote:/some/dir/

4

rsync là một chương trình hoạt động giống như rcp, nhưng có nhiều tùy chọn hơn và sử dụng giao thức cập nhật từ xa rsync để tăng tốc độ truyền tệp khi tệp đích đang được cập nhật.

Giao thức cập nhật từ xa rsync cho phép rsync chỉ chuyển những điểm khác biệt giữa hai tập hợp tệp qua kết nối mạng, sử dụng thuật toán tìm kiếm tổng kiểm tra hiệu quả được mô tả trong báo cáo kỹ thuật đi kèm gói này.


Sao chép thư mục từ vị trí này sang vị trí khác

   #!/usr/bin/expect -f   
   spawn rsync -a -e ssh username@192.168.1.123:/cool/cool1/* /tmp/cool/   
   expect "password:"   
   send "cool\r"   
   expect "*\r"   
   expect "\r"  

3

Nếu bạn đồng ý với việc nhập mật khẩu của mình một lần cho mỗi lần chạy tập lệnh, bạn có thể làm như vậy dễ dàng bằng cách sử dụng kết nối chính SSH.

#!/usr/bin/env bash

USER_AT_HOST="user@host"  # use "$1@$2" here if you like
SSHSOCKET=~/".ssh/$USER_AT_HOST"

# This is the only time you have to enter the password:
# Open master connection:
ssh -M -f -N -o ControlPath="$SSHSOCKET" "$USER_AT_HOST"

# These do not prompt for your password:
scp -o ControlPath="$SSHSOCKET" file1.xy "$USER_AT_HOST":remotefile1.xy
scp -o ControlPath="$SSHSOCKET" file2.xy "$USER_AT_HOST":remotefile2.xy

# You can also use the flag for normal ssh:
ssh -o ControlPath="$SSHSOCKET" "$USER_AT_HOST" "echo hello"
ssh -o ControlPath="$SSHSOCKET" "$USER_AT_HOST" "echo world"

# Close master connection:
ssh -S "$SSHSOCKET" -O exit "$USER_AT_HOST"

2

Bạn có thể làm điều đó chỉ với các khóa công khai / riêng tư ssh. Hoặc sử dụng putty trong đó bạn có thể đặt mật khẩu. scp không hỗ trợ cung cấp mật khẩu trong dòng lệnh.

Bạn có thể tìm thấy hướng dẫn về khóa công khai / riêng tư tại đây: http://www.softpanorama.org/Net/Application_layer/SSH/scp.shtml


1

Điều này sẽ hoạt động:

#!/usr/bin/expect -f

spawn scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no file1 file2 file3 user@host:/path/
expect "password:"
send "xyz123\r"
expect "*\r"
expect "\r"
interact

1

đây là mã cơ sở cho SCP với tệp khóa .pem. Chỉ cần lưu nó vào tệp script.sh sau đó chạy với 'sh script.sh'

Thưởng thức

#!/bin/bash
#Error function
function die(){
echo "$1"
exit 1
}

Host=ec2-53-298-45-63.us-west-1.compute.amazonaws.com
User=ubuntu
#Directory at sent destination
SendDirectory=scp
#File to send at host
FileName=filetosend.txt
#Key file
Key=MyKeyFile.pem

echo "Aperture in Process...";

#The code that will send your file scp
scp -i $Key $FileName $User@$Host:$SendDirectory || \
die "@@@@@@@Houston we have problem"

echo "########Aperture Complete#########";

0

Hãy thử lftp

lftp -u $user,$pass sftp://$host << --EOF--

cd $directory

put $srcfile

quit

--EOF--

-1

Lệnh scpcó thể được sử dụng giống như một UNIX truyền thống cp. VẬY nếu bạn làm:

scp -r myDirectory/ mylogin@host:TargetDirectory

sẽ làm việc


1
Điều này dường như không giải quyết được Mật khẩu.
Delicia Brummitt,
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.