SSH: thực thi lệnh sudo


44

Tôi có một tập lệnh shell tương tác, tại một nơi cần phải ssh đến một máy khác (dựa trên Ubuntu) và thực thi một cái gì đó bằng root (người dùng nên nhập mật khẩu của mình, nhưng lệnh từ xa sẽ chạy như được ghi chú trong tập lệnh):

# ...
ssh remote-machine 'sudo ls'
# ...

Tuy nhiên, tôi luôn nhận được thông báo lỗi này:

sudo: no tty present and no askpass program specified

OK, điều đó khá rõ ràng. Nhưng làm thế nào tôi có thể phá vỡ điều này? Một cái gì đó như thế này sẽ xảy ra:

$ ssh remote-machine 'sudo ls /'
[sudo] password for user1:

/bin
/etc
/var

Câu trả lời:


52

Điều kỳ diệu sshcó một phương thuốc cho tất cả mọi thứ. Vấn đề là thêm -tcờ để buộc ssh phân bổ giả:

ssh -t remote-server 'sudo ls'

1
PTY có thể làm rối tung mọi thứ với các tập lệnh, tuy nhiên. lsđầu ra sẽ chứa các kết thúc \ r \ n chẳng hạn.
Tobu

1
Cách dễ dàng đó là buộc ls vào chế độ không đầu cuối. ls | catsẽ làm - nó sẽ thấy rằng thiết bị xuất chuẩn là một đường ống. Trong câu hỏi cụ thể này, điều đó không liên quan, vì rõ ràng nó có ý định được chạy tương tác từ một thiết bị đầu cuối - vì vậy bạn có thể muốn các cột và màu sắc và không có gì.
Gabe

0

Phương thức này sẽ chạy một tập lệnh bằng sudo sau ssh:

Giả sử chúng ta có một người dùng "từ xa" có khả năng sudo và chúng ta có một tập lệnh mà chúng ta muốn nó thực thi như root.

1) Đặt tập lệnh trong / etc / passwd sẽ được sử dụng khi đăng nhập:

remote:x:1100:1100:Some Remote User,,,:/home/remote:/home/remote/login.sh

2) Bên trong "login.sh", chúng tôi thực thi tập lệnh mà chúng tôi muốn chạy là "sudo":

#!/bin/bash
if [ "$(id -u)" != "0" ]; then
    #Not running as root, so we execute "sudo"
    sudo /usr/local/bin/script.sh
else
    #We are already rooted, so "sudo" is not required.
    /usr/local/bin/script.sh
fi
exit;

Thông thường nó sẽ hỏi mật khẩu hai lần: ssh đăng nhập + sudo. Nếu bạn chỉ muốn nhập nó một lần, hãy thử sudo mà không cần mật khẩu (không được khuyến nghị). <- vui lòng đọc bình luận Boldewyn.

Ưu điểm chính là "ssh" không yêu cầu bất kỳ tham số nào khác (như -t) và sudo bị buộc ở phía máy chủ. Ngoài ra, một khi tập lệnh thoát, người dùng cũng đăng xuất.

Nó có thể không phải là thanh lịch, nhưng nó đơn giản và hoạt động.


À ồ. Đưa người dùng từ xa của bạn vào sudoerstệp trên máy chủ như thế này là một thảm họa đang chờ xảy ra. Nếu bất cứ ai có được quyền truy cập như người dùng của bạn (ví dụ: thông qua máy chủ web), anh ta có thể ngay lập tức trở thành root. Cảm ơn bạn, nhưng tôi đã tìm kiếm giải pháp, điều đó không đặt cấu hình máy chủ của tôi ở mức chênh lệch. Nếu bạn có một giải pháp, bằng cách nào đó sử dụng lại xác thực một cách kỳ diệu từ SSH cho sudolệnh, tôi sẽ quan tâm hơn (và có lẽ sẽ bắt đầu tìm kiếm thay thế cho SSH ...).
Boldewyn

@Boldewyn: có, đặt "sudo không có mật khẩu" có rủi ro bảo mật đó ... đó là một bước tùy chọn. Tôi đồng ý với bạn, nếu SSH có thể sử dụng lại xác thực, loại "giải pháp" này sẽ không được yêu cầu. Cám ơn bạn đã góp ý.
Lepe

-1

Bạn có thể chạy lệnh sau để có quyền truy cập root mà không cần tương tác:

ssh server " sudo command" < sudopassword.txt

1
Điều đó sẽ không hoạt động vì stdin sẽ không phải là thiết bị đầu cuối (nó sẽ được đọc từ tệp được chỉ định).
Anthony G - công lý cho Monica
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.