Làm thế nào để thực hiện các thay đổi trên máy chủ từ xa như root?


8

Tôi đang tự hỏi liệu có cách nào để thực thi tập lệnh / lệnh từ máy cục bộ mà không thực hiện bất kỳ sửa đổi nào khi root trên máy từ xa không?

Một số nền tảng

Tôi đang cố gắng thiết lập một số tác vụ thông qua Capistrano và tôi yêu cầu sudoquyền truy cập. Có khoảng hơn 30 máy chủ và để tôi cập nhật thủ công /etc/sudoerssẽ rất đau nên tôi tự hỏi liệu có phương pháp nào để cập nhật tệp này từ xa không?


Bạn có thể sử dụng Fabric có tương tác từ xa. Bạn có thể làm tương tự mà không có tương tác song song bằng fabric.contrib.files.sedphương pháp.
lcipriani

Nếu bạn có 30 máy chủ bạn đang quản lý, tôi rất khuyến nghị SaltStack
Wayne Werner

Câu trả lời:


18

Bạn có thể chạy các tập lệnh cục bộ từ xa bằng cách thực thi bashtrên hệ thống từ xa và cho nó tập lệnh của bạn

$ ssh user@host 'bash -s' < script.sh

Biên tập

Để thực thi các lệnh yêu cầu sử dụng sudotrên một máy từ xa, hãy sử dụng ssh's -ttùy chọn và chuyển các lệnh tới ssh. Các -ttùy chọn phân bổ một tty psuedo và cho phép người dùng tương tác với các lệnh chạy bởi ssh, chẳng hạn như nhập một mật khẩu chosudo

$ ssh user@host -t 'sudo foo'

Để sửa đổi một tệp bằng phương pháp sednày được khuyến nghị qua chuyển hướng >vì chuyển hướng shell không cho phép ghi tệp khi sử dụng sudo. Ngoài ra, tất cả các biến trong sedlệnh cần phải được thoát khi chúng được chuyển đến ssh.

$ ssh user@host -t 'sudo sed -i "\$a text to insert" /path/to/file'

Để tự động hóa toàn bộ:

#!/bin/bash
SERVERS=( server1 server2 server3 )

for HOST in ${SERVERS[@]}; do 
    ssh user@${HOST} -t 'sudo sed -i "\$a text to insert" /path/to/file'

    if [[ $? -ne 0 ]]; then
        echo "ERROR: $HOST did not complete"
     else   
        echo "$HOST complete"
    fi   
done

Cảm ơn kịch bản và tất cả nhưng nó không thực sự trả lời câu hỏi của tôi. Nếu tôi muốn sửa đổi /etc/sudoerstập tin do quyền root thì nó sẽ thất bại.
kaizenCoder

@aspiresCodeArtisan xem các chỉnh sửa cho câu trả lời
Lạch

Xin chào, ngay cả lời nhắc về sudomật khẩu mà từ những gì tôi hiểu được đặt trong/etc/sudoers
kaizenCoder

1
@aspiresCodeArtisan Nếu tài khoản của bạn không có sudoquyền trên các máy này, thì để sửa đổi /etc/sudoersbạn sẽ phải đăng nhập qua ssh như root. Vì vậy, lệnh sẽ làssh root@host -t 'sed -i "\$a text to insert" /path/to/file'
Lạch

đăng nhập ssh gốc bị tắt theo mặc định vì vậy nó không phải là một tùy chọn. Tôi nghĩ rằng tôi có thể yêu cầu điều không thể.
kaizenCoder

1

Tôi thấy teelệnh này hữu ích trong việc tránh giới hạn sudo trên chuyển hướng tập tin. Sử dụng sed tỏ ra bực bội do yêu cầu thoát khỏi nhân vật.

Đây là lệnh tôi đã sử dụng để nối từ xa các máy chủ cho tất cả các máy trong cụm của tôi vào / etc / hosts:

for i in {1..10}; do ssh ubuntu@10.1.1.$i -t "echo '10.1.1.1 dev-1    
10.1.1.4 dev-4
10.1.1.3 dev-3
10.1.1.2 dev-2
10.1.1.6 dev-6
10.1.1.8 dev-8
10.1.1.5 dev-5
10.1.1.10 dev-10
10.1.1.9 dev-9
10.1.1.7 dev-7' | sudo tee -a /etc/hosts >/dev/null"

Đầu ra cho mỗi lần lặp trông như thế này:

0+1 records in
0+1 records out
255 bytes (255 B) copied, 4.1338e-05 s, 6.2 MB/s

Câu trả lời SU này là then chốt trong việc xây dựng giải pháp cuối cùng của tôi: https://superuser.com/a/1026359/587485


1

Nếu bạn cần chạy nhiều lệnh hoặc chuyển hướng, bạn nên sử dụng cú pháp sau:

ssh server.com "sudo sh -c 'ps aux | grep jav > /root/1.txt'"

0

Bạn sẽ phải có một số loại quyền truy cập cấp gốc, thông qua mật khẩu gốc trực tiếp hoặc thiết lập quy tắc sudo id người dùng của bạn trước khi thử sửa đổi tệp sudoers.

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.