Thực thi lệnh trong kết nối sftp thông qua tập lệnh


13

Đây là một câu hỏi rất cơ bản, tôi chỉ mới biết về bash và không thể tìm ra cách để làm điều này. Googling không may không đưa tôi đến bất cứ nơi nào.

Mục tiêu của tôi là kết nối với sftp đến một máy chủ, tải lên một tệp và sau đó ngắt kết nối.

Tôi có đoạn script sau:

UpdateJar.sh

#!/bin/bash

sftp -oPort=23 kalenpw@184.155.136.254:/home/kalenpw/TestWorld/plugins
#Change directory on server
#cd /home/kalenpw/TestWorld/plugins

#Upload file
put /home/kalenpw/.m2/repository/com/Khalidor/TestPlugin/0.0.1-SNAPSHOT/TestPlugin-0.0.1-SNAPSHOT.jar

exit

Vấn đề là, tập lệnh này sẽ thiết lập kết nối sftp và sau đó không làm gì cả. Khi tôi gõ thủ công thoát trong kết nối, nó cố gắng thực hiện lệnh put nhưng vì phiên sftp đã bị đóng nên nó chỉ nói lệnh put: không tìm thấy.

Làm thế nào tôi có thể làm cho điều này để làm việc đúng?

Cảm ơn


Câu trả lời:


15

Bạn có thể thay đổi tập lệnh của mình để truyền các lệnh trong tài liệu ở đây, ví dụ:

#!/bin/bash

sftp -oPort=23 kalenpw@184.155.136.254:/home/kalenpw/TestWorld/plugins <<EOF
put /home/kalenpw/.m2/repository/com/Khalidor/TestPlugin/0.0.1-SNAPSHOT/TestPlugin-0.0.1-SNAPSHOT.jar   
exit
EOF

Điểm <<đánh dấu theo sau tên ( EOF) cho biết kịch bản chuyển các dòng sau cho đến khi tìm thấy tên ở đầu dòng (bằng chính nó).


Tuyệt vời mà đã làm chính xác những gì tôi cần. Tôi sẽ phải đọc tài liệu ở đây. Cảm ơn câu trả lời nhanh Tôi sẽ chấp nhận nó sau 8 phút.
kalenpw

Không có vấn đề gì (tôi đã tìm một bản sao nhưng chỉ thấy một bản đóng là "không rõ ràng").
Thomas Dickey

Bạn có chắc chắn máy chủ sẽ không bị nghẹt thở vì những bình luận của shell-script không?
alk

Ngoài ra phương pháp này phụ thuộc vào loại vỏ.
alk

@alk kịch bản hoạt động có và không có bình luận
kalenpw

5

Bạn có thể thích sử dụng scpthay vì sftp. scphoạt động giống như cplệnh thông thường , nhưng các tệp có thể ở xa:

scp -P 23 /home/kalenpw/.m2/repository/com/Khalidor/TestPlugin/0.0.1-SNAPSHOT/TestPlugin-0.0.1-SNAPSHOT.jar kalenpw@184.155.136.254:/home/kalenpw/TestWorld/plugins

Thao tác này sao chép tệp trên máy cục bộ của bạn vào một thư mục trên máy từ xa mà không phải sử dụng giao diện lệnh kiểu ftp kiểu cũ.

Các ssh, scpsftpcác dịch vụ thường có sẵn nếu bất kỳ trong số chúng là; cùng một chương trình daemon cung cấp tất cả chúng cùng một lúc. Về nguyên tắc, quản trị viên của máy chủ có thể chọn vô hiệu hóa bất kỳ ứng dụng nào trong số đó, nhưng trên thực tế, điều đó khá hiếm.


Không biết về scp trước trông rất hữu ích. Và bạn đã đúng scpđã có sẵn trên máy của tôi
kalenpw

4

Bạn cũng có thể sử dụng -btùy chọn sftpđể chỉ ra một tệp chứa các lệnh cho sftp.

Ví dụ: bạn có thể đặt tất cả các lệnh của mình vào tệp sftp_commands.txt:

cd /home/kalenpw/TestWorld/plugins
put /home/kalenpw/.m2/repository/com/Khalidor/TestPlugin/0.0.1-SNAPSHOT/TestPlugin-0.0.1-SNAPSHOT.jar
exit

và chạy sftpnhư:

sftp -oPort=23 -b sftp_commands.txt kalenpw@184.155.136.254:/home/kalenpw/TestWorld/plugins 

Hoặc bạn cũng có thể chuyển các lệnh qua STDIN nếu bạn không muốn sử dụng tệp.

Từ man sftp:

-b lô

Chế độ hàng loạt đọc một loạt các lệnh từ một tệp dữ liệu đầu vào thay vì stdin. Vì nó thiếu tương tác người dùng, nên được sử dụng cùng với xác thực không tương tác. Một tập hợp '-' có thể được sử dụng để biểu thị đầu vào tiêu chuẩn. sftp sẽ hủy bỏ nếu bất kỳ lệnh nào sau đây thất bại: get, put, reget, rename, ln, rm, mkdir, chdir, ls, lchdir, chmod, chown, chgrp, lpwd, df, symlink và lmk Chấm dứt lỗi có thể được loại bỏ trên một lệnh bằng cơ sở lệnh bằng cách sửa trước lệnh bằng ký tự '-' (ví dụ: -rm / tmp / blah *).


2

Một lựa chọn khác là sử dụng curl :

curl -u user -T file.tar sftp://example.com/home/user/
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.