viết một tập lệnh shell sang ssh vào một máy từ xa và thực hiện các lệnh


97

Tôi có hai câu hỏi:

  1. Có nhiều máy linux từ xa và tôi cần viết một tập lệnh shell sẽ thực thi cùng một bộ lệnh trong mỗi máy. (Bao gồm một số thao tác sudo). Làm thế nào điều này có thể được thực hiện bằng cách sử dụng shell script?
  2. Khi truy cập vào máy từ xa, cách xử lý khi máy nhắc xác thực dấu vân tay RSA.

Các máy từ xa là các máy ảo được tạo ra khi đang chạy và tôi chỉ có IP của chúng. Vì vậy, tôi không thể đặt trước một tệp script vào các máy đó và thực thi chúng từ máy của mình.


Tôi nghĩ đến việc triển khai một chương trình giống tác nhân trong các máy Linux từ xa, chương trình này duy trì kết nối với máy chủ bằng kết nối ổ cắm mạng (hoặc SSL) / bằng cách thăm dò định kỳ tới máy chủ.
Raptor

Tôi cần phải thực hiện một tập hợp các lệnh chỉ một lần, vì vậy nó không phải là cần thiết để duy trì kết nối
Balanivash

"no scripts" có nghĩa là "không có tệp nào cả", tôi cho là vậy? Làm thế nào để bạn xử lý xác thực? Bạn có thể tắt tính năng kiểm tra dấu vân tay của máy chủ (xem câu trả lời của tôi), nhưng bạn vẫn nhận được lời nhắc mật khẩu tương tác nếu bạn chưa thiết lập khóa công khai / riêng tư.
Andreas Fester

1
Andreas: vâng. không có tệp nào cả. dấu nhắc passwd có thể bị xử lý sử dụng expectlà `mong đợi " assword: "`
Balanivash

Câu trả lời:


141

Có nhiều máy linux từ xa và tôi cần viết một tập lệnh shell sẽ thực thi cùng một bộ lệnh trong mỗi máy. (Bao gồm một số thao tác sudo). Làm thế nào điều này có thể được thực hiện bằng cách sử dụng shell script?

Bạn có thể làm điều này với ssh, ví dụ:

#!/bin/bash
USERNAME=someUser
HOSTS="host1 host2 host3"
SCRIPT="pwd; ls"
for HOSTNAME in ${HOSTS} ; do
    ssh -l ${USERNAME} ${HOSTNAME} "${SCRIPT}"
done

Khi truy cập vào máy từ xa, cách xử lý khi máy nhắc xác thực dấu vân tay RSA.

Bạn có thể thêm StrictHostKeyChecking=notùy chọn vào ssh:

ssh -o StrictHostKeyChecking=no -l username hostname "pwd; ls"

Thao tác này sẽ tắt kiểm tra khóa máy chủ và tự động thêm khóa máy chủ vào danh sách các máy chủ đã biết. Nếu bạn không muốn thêm máy chủ vào tệp máy chủ đã biết, hãy thêm tùy chọn -o UserKnownHostsFile=/dev/null.

Lưu ý rằng điều này sẽ vô hiệu hóa một số kiểm tra bảo mật , ví dụ như bảo vệ chống lại cuộc tấn công kẻ trung gian. Do đó, nó không nên được áp dụng trong một môi trường nhạy cảm về bảo mật.


Ngôn ngữ kịch bản là gì? Bạn có thể dĩ nhiên cũng gọi sshtừ bất kỳ shell script
Andreas mưng mủ

Còn nếu bạn cũng muốn thực hiện CTRL + C và tiếp tục ssh đến nhiều máy chủ thì sao ?. Ví dụ trong một số máy chủ đang yêu cầu mật khẩu và trong một số khác thì không, vì vậy tập lệnh sẽ bị kẹt ở đó. có cách nào để thực hiện một số cách tương tự như -o để thực hiện CTRL c hoặc CTRL d không?
Chanafot

5

Có một số cách để xử lý điều này.

Cách yêu thích của tôi là cài đặt http://pamsshagentauth.sourceforge.net/ trên hệ thống từ xa và cũng là khóa công khai của riêng bạn. (Tìm ra cách để cài đặt những thứ này trên máy ảo, bằng cách nào đó bạn đã cài đặt toàn bộ hệ thống Unix, thêm vài tệp nữa là gì?)

Với tác nhân ssh của bạn được chuyển tiếp, giờ đây bạn có thể đăng nhập vào mọi hệ thống mà không cần mật khẩu.

Và tốt hơn nữa, mô-đun pam đó sẽ xác thực cho sudo bằng cặp khóa ssh của bạn để bạn có thể chạy với quyền root (hoặc bất kỳ người dùng nào khác) khi cần.

Bạn không cần phải lo lắng về sự tương tác của phím máy chủ. Nếu đầu vào không phải là thiết bị đầu cuối thì ssh sẽ chỉ hạn chế khả năng chuyển tiếp các tác nhân và xác thực bằng mật khẩu của bạn.

Bạn cũng nên xem xét các gói như Capistrano. Chắc chắn hãy nhìn xung quanh trang web đó; nó có một giới thiệu về kịch bản từ xa.

Các dòng script riêng lẻ có thể trông giống như sau:

ssh remote-system-name command arguments ... # so, for exmaple,
ssh target.mycorp.net sudo puppet apply

4

Cài đặt sshpass bằng cách sử dụng, apt-get install sshpasssau đó chỉnh sửa tập lệnh và đặt IP, tên người dùng và mật khẩu máy linux của bạn theo thứ tự tương ứng. Sau đó chạy tập lệnh đó. Đó là nó ! Tập lệnh này sẽ cài đặt VLC trong tất cả các hệ thống.

#!/bin/bash
SCRIPT="cd Desktop; pwd;  echo -e 'PASSWORD' | sudo -S apt-get install vlc"
HOSTS=("192.168.1.121" "192.168.1.122" "192.168.1.123")
USERNAMES=("username1" "username2" "username3")
PASSWORDS=("password1" "password2" "password3")
for i in ${!HOSTS[*]} ; do
     echo ${HOSTS[i]}
     SCR=${SCRIPT/PASSWORD/${PASSWORDS[i]}}
     sshpass -p ${PASSWORDS[i]} ssh -l ${USERNAMES[i]} ${HOSTS[i]} "${SCR}"
done

sử dụng $ SSHPASS để xuất mật khẩu nhằm tránh hiển thị trong tập lệnh. Tham khảo: tecmint.com/…
Hexy

2

Nếu bạn có thể viết mã Perl, thì bạn nên xem xét sử dụng Net :: OpenSSH :: Parallel .

Bạn sẽ có thể mô tả các hành động phải chạy trong mọi máy chủ theo cách khai báo và mô-đun sẽ xử lý tất cả các chi tiết đáng sợ. Chạy các lệnh thông qua sudocũng được hỗ trợ.


2

Điều này làm việc cho tôi.

Cú pháp: ssh -i pemfile.pem user_name @ ip_address 'command_1; lệnh 2; lệnh 3 '

#! /bin/bash

echo "########### connecting to server and run commands in sequence ###########"
ssh -i ~/.ssh/ec2_instance.pem ubuntu@ip_address 'touch a.txt; touch b.txt; sudo systemctl status tomcat.service'

1

Đối với loại tác vụ này, tôi liên tục sử dụng Ansible cho phép sao chép các tập lệnh bash mạch lạc trong một số container hoặc VM. Ansible (chính xác hơn là Red Hat ) hiện có giao diện web bổ sung AWX , đây là phiên bản mã nguồn mở của Tower thương mại của họ.

Ansible: https://www.ansible.com/
AWX: https://github.com/ansible/awx
Ansible Tower: sản phẩm thương mại, bạn có thể sẽ khám phá AWX mã nguồn mở miễn phí, thay vì 15 ngày miễn phí of Tower


1

Có nhiều cách để thực thi các lệnh hoặc tập lệnh trong nhiều máy Linux từ xa. Một cách đơn giản & dễ dàng nhất là thông qua pssh (chương trình ssh song song)

pssh : là một chương trình thực thi ssh song song trên một số máy chủ. Nó cung cấp các tính năng như gửi đầu vào cho tất cả các quy trình, chuyển mật khẩu vào ssh, lưu đầu ra vào tệp và hết thời gian.

Ví dụ & Cách sử dụng:

Kết nối với host1 và host2 và in "hello, world" từ mỗi:

 pssh -i -H "host1 host2" echo "hello, world"

Chạy các lệnh thông qua một tập lệnh trên nhiều máy chủ:

pssh -h hosts.txt -P -I<./commands.sh

Sử dụng & chạy lệnh mà không cần kiểm tra hoặc lưu khóa máy chủ:

pssh -h hostname_ip.txt -x '-q -o StrictHostKeyChecking=no -o PreferredAuthentications=publickey -o PubkeyAuthentication=yes' -i  'uptime; hostname -f'

Nếu tệp hosts.txt có một số lượng lớn các mục nhập, chẳng hạn như 100, thì tùy chọn song song cũng có thể được đặt thành 100 để đảm bảo rằng các lệnh được chạy đồng thời:

pssh -i -h hosts.txt -p 100 -t 0 sleep 10000

Tùy chọn :
-Tôi: Đọc đầu vào và gửi đến mỗi quá trình ssh.
-P: Cho pssh biết để hiển thị đầu ra khi nó đến.
-h: Đọc tệp của máy chủ.
-H: [user @] host [: port] cho một máy chủ.
-i: Hiển thị đầu ra tiêu chuẩn và lỗi tiêu chuẩn khi mỗi máy chủ hoàn thành
-x args: Truyền đối số dòng lệnh SSH bổ sung
-o option: Có thể được sử dụng để cung cấp các tùy chọn ở định dạng được sử dụng trong tệp cấu hình. (/ etc / ssh / ssh_config ) (~ / .ssh / config)
-p song song: Sử dụng số đã cho làm số lượng kết nối đồng thời tối đa
-q Chế độ im lặng: Làm cho hầu hết các thông báo cảnh báo và chẩn đoán bị chặn.
-t: Kết nối hết thời gian chờ sau số giây nhất định. 0 nghĩa là pssh sẽ không hết thời gian chờ bất kỳ kết nối nào

Khi truy cập vào máy từ xa, cách xử lý khi máy nhắc xác thực dấu vân tay RSA.

Tắt tính năng Kiểm tra Chìa khóa Nghiêm ngặt để xử lý lời nhắc xác thực RSA.
-o precisionHostKeyChecking = không

Nguồn : man pssh


0

Điều này đã làm việc cho tôi. Tôi đã thực hiện một chức năng. Đặt cái này trong tập lệnh shell của bạn:

sshcmd(){
    ssh $1@$2 $3
}

sshcmd USER HOST COMMAND

Nếu bạn có nhiều máy muốn thực hiện cùng một lệnh trên, bạn sẽ lặp lại dòng đó bằng dấu chấm phẩy. Ví dụ: nếu bạn có hai máy, bạn sẽ làm như sau:

sshcmd USER HOST COMMAND ; sshcmd USER HOST COMMAND

Thay thế USER bằng người dùng máy tính. Thay HOST bằng tên của máy tính. Thay thế COMMAND bằng lệnh bạn muốn thực hiện trên máy tính.

Hi vọng điêu nay co ich!


-1

Bạn có thể làm theo cách này:

  • Kết nối với máy từ xa bằng Expect Script . Nếu máy của bạn không hỗ trợ, bạn có thể tải xuống như vậy. Viết kịch bản Expect rất dễ dàng (google để nhận trợ giúp về điều này)
  • Đặt tất cả các hành động cần được thực hiện trên máy chủ từ xa trong một tập lệnh shell.
  • Gọi tập lệnh shell từ xa từ tập lệnh mong đợi sau khi đăng nhập thành công.

Như tôi đã đề cập trong câu hỏi, các máy từ xa được tạo khi đang chạy và tôi không thể có bất kỳ tập lệnh nào trong máy trước đó.
Balanivash

Trong trường hợp đó, hãy đặt tất cả hành động trong tập lệnh Expect. Tập lệnh Expect cũng có thể chạy các lệnh trên máy chủ từ xa.
rai.skumar
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.