Làm thế nào để viết một tập lệnh bash, đăng nhập vào một máy khác để làm công cụ?


11

Có thể viết một tập lệnh bash không

  1. sẽ được khởi động từ máy A, đăng nhập vào một máy B khác bằng ssh (cả hai máy A và B sẽ là Linux-Machines),
  2. sao chép một số tập tin vào máy B
  3. chạy một kịch bản python một kịch bản python đã cho trên các máy này.
  4. chuyển kết quả trở lại máy A
  5. đăng xuất khỏi máy B.

Đây có phải là kỹ thuật có thể làm được?

Câu trả lời:


15

Tất nhiên là có thể làm được:

scp file user@host:
ssh user@host path_to_script
scp user@host:file_to_copy ./

và đó là ...

Nhưng có một vấn đề: bạn sẽ được yêu cầu nhập mật khẩu ba lần. Để tránh điều đó, bạn có thể tạo các khóa ssh và ủy quyền cho người dùng bằng các phím này.

Để tạo khóa ssh chạy ssh-keygen -t rsa, trả lời câu hỏi và sao chép khóa chung vào máy chủ từ xa (máy B) vào ~/.ssh/authorized_keystệp. Khóa riêng phải được lưu trong ~/.ssh/id_rsamáy cục bộ (A).


Nếu khóa công khai không có tùy chọn, bạn có thể làm điều gì đó thô thiển để giảm thiểu lời nhắc mật khẩu nhưcat file | ssh user@host 'cat > /destination/of/file; /path/to/script &>/dev/null; cat results' > /destination/of/results
Patrick

Nếu bạn muốn sử dụng mật khẩu, bạn luôn có thể sử dụng kết nối pooling OpenSSH bằng cách xác định ControlMaster=yesControlPath=/path/to/socketfile, và sau đó bắt đầu một kết nối ssh với -fchạy một ssh nền. Nói cho tất cả các kết nối SSH tiếp theo sử dụng cùng một tệp ổ cắm.
jsbillings

4

Tôi có thể thực hiện mọi thứ trong một sshkết nối / phiên duy nhất :

ssh user@host "cat > remote_dst; command; cat remote_src" < local_src > local_dst

Điều này:

  1. Bản sao local_srcđể remote_dst,
  2. Thực thi command,
  3. Bản sao remote_srcđể local_dst.

Nhưng nếu commandviết vào stdout, kết quả với cũng được local_dst. Nếu commandđọc đầu vào từ stdin, nó sẽ nhận và EOF.


3

Mặc dù bạn có thể thực hiện việc này trong một phiên ssh duy nhất, nhưng hơi khó để kết hợp sao chép tệp với các lệnh đang chạy.

Cách dễ nhất để giải quyết nhiệm vụ này là chạy các phiên SSH riêng cho ba thao tác:

rsync -a inputs/ machineB:inputs/
ssh machineB 'some command -i inputs -o outputs'
rsync -a machineB:outputs/ outputs/

Điều này đòi hỏi phải xác thực với machineB ba lần. Cách được đề xuất để tránh xác thực nhiều lần là sử dụng tiện ích chia sẻ kết nối trong các phiên bản hiện đại của OpenSSH: bắt đầu kết nối chính với B một lần và mãi mãi, hãy để SSH tự động cõng lên kết nối chính đó. Thêm ControlMaster autovà một ControlPathdòng cho bạn~/.ssh/config , sau đó bắt đầu một kết nối chính trong nền, sau đó thực hiện các nhiệm vụ của bạn.

ssh -fN machineB                         # start a master connection in the background
# Subsequent connections will be slaves to the existing master connection
rsync -a inputs/ machineB:inputs/
ssh machineB 'some command -i inputs -o outputs'
rsync -a machineB:outputs/ outputs/

Thay vì sử dụng scp hoặc rsync để sao chép tệp, có thể dễ dàng hơn để gắn hệ thống tệp từ xa trong SSHFS . Nhân tiện, việc này sẽ đảm nhiệm việc thiết lập kết nối chính (giả sử bạn đã thiết lập kết nối ~/.ssh/confignhư đã nêu ở trên).

mkdir /net/machineB
sshfs machineB: /net/machineB
cp -Rp inputs /net/machineB/
ssh machibeB 'some command -i inputs -o outputs'
cp -Rp /net/machineB/outputs .
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.