cách thích hợp để sudo hơn ssh


150

Tôi có một tập lệnh chạy tập lệnh khác thông qua SSH trên máy chủ từ xa bằng sudo. Tuy nhiên, khi tôi gõ mật khẩu, nó sẽ hiển thị trên thiết bị đầu cuối. (Nếu không thì nó hoạt động tốt)

ssh user@server "sudo script"

Cách thích hợp để làm điều này là gì để tôi có thể nhập mật khẩu cho sudo qua SSH mà không cần mật khẩu xuất hiện khi tôi nhập?


2
đối với tôi, lý do để tìm cách sudoing thông qua ssh là vì nó không hoạt động khi thử một cái gì đó như ssh <user@server> sudo <script>, vì tôi đã nhận được lỗisudo: no tty present and no askpass program specified
knocte 11/07/2016

Câu trả lời:


244

Một cách khác là sử dụng công -ttắc để ssh:

ssh -t user@server "sudo script"

Xem man ssh:

 -t      Force pseudo-tty allocation.  This can be used to execute arbi-
         trary screen-based programs on a remote machine, which can be
         very useful, e.g., when implementing menu services.  Multiple -t
         options force tty allocation, even if ssh has no local tty.

2
Thật tuyệt, tôi biết tùy chọn -t, chỉ không biết nó hoạt động cho lời nhắc sudo.

3
Tùy chọn -t để làm gì?
Vince


3
Nó không hoạt động ở đây: ssh -t localhost <<< "sudo touch file;"EDIT Rõ ràng điều quan trọng là bạn thực sự cung cấp lệnh dưới dạng tham số, không thông qua tiêu chuẩn (điều này có ý nghĩa trong nhận thức muộn).
Chuộc tội giới hạn

các -tphương pháp cũng sẽ hiển thị đầu ra màu các lệnh mà thường làm như vậy.
karmakaze

24

Tôi đã có thể tự động hóa hoàn toàn nó bằng lệnh sau:

echo pass | ssh -tt user@server "sudo script"

Ưu điểm:

  • không nhắc mật khẩu
  • Sẽ không hiển thị mật khẩu trong lịch sử bash máy từ xa

Về bảo mật: như Kurt đã nói, chạy lệnh này sẽ hiển thị mật khẩu của bạn trên lịch sử bash cục bộ của bạn và tốt hơn là lưu mật khẩu trong một tệp khác hoặc lưu tất cả lệnh trong tệp .sh và thực thi nó. LƯU Ý: Tệp cần phải có quyền chính xác để chỉ những người dùng được phép mới có thể truy cập.


8
Nó sẽ hiển thị trên lịch sử bash của hệ thống địa phương, bao gồm cả mật khẩu. Tốt hơn để lưu trữ mật khẩu trong một tập tin và cat tập tin.
Kurt Fitzner

4
Man, tôi biết -t, nhưng tôi đã không đọc kỹ hướng dẫn để thấy rằng bạn có thể vượt qua nó hai lần! Đây là những gì tôi đã tìm kiếm trong nhiều tháng! Là một bổ sung bảo mật, tôi chỉ cần đặt một biến mật khẩu trước khi chạy read -s -p "Password: " pw, sau đó đã làm echo "$pw" | ..... Bây giờ tôi đã biến điều này thành một kịch bản tiện dụng cho chính mình :).
kael

Làm việc như quyến rũ đối với tôi!
MiKr13

Tại sao bạn không thiết lập sudo không mật khẩu cho bất kỳ người dùng và lệnh cụ thể nào bạn cần chạy? Đây không phải là một vấn đề SSH ...
Tên của

@nomen giải pháp của bạn cũng hợp lệ, nhưng yêu cầu các bước bổ sung. Nếu tôi có nhiều thiết bị không có người dùng sudo không mật khẩu, tôi có thể tạo tập lệnh tự động hóa bằng giải pháp này. Đôi khi bạn làm việc trên một hệ thống mà bạn không sở hữu và bạn không muốn hoặc không thể thay đổi, đôi khi có những cân nhắc khác.
ofirule

6

Giả sử bạn muốn không có mật khẩu nhắc :

ssh $HOST 'echo $PASSWORD | sudo -S $COMMMAND'

Thí dụ

ssh me@localhost 'echo secret | sudo -S echo hi' # outputs 'hi'

14
Điều này là / rất / nguy hiểm vì mật khẩu văn bản gốc kết thúc trên dòng lệnh. Các dòng lệnh là công khai và có thể được nhìn thấy bởi mọi người dùng khác và xử lý trên hệ thống. Ví dụ: "ps auxwwwww" của một người dùng không có đặc quyền sẽ hiển thị mọi quy trình đang chạy và các dòng lệnh chạy chúng.
Kurt Fitzner

3
Không đề cập đến việc đặt mật khẩu của bạn (trong bản rõ) vào tệp bash_history.
Layne Bernardo

4

Sudo qua SSH truyền mật khẩu, không yêu cầu tty:

Bạn có thể sử dụng sudo over ssh mà không buộc ssh phải có pseudo-tty (không sử dụng công tắc ssh "-t") bằng cách nói với sudo không yêu cầu mật khẩu tương tác và chỉ lấy mật khẩu khỏi stdin. Bạn làm điều này bằng cách sử dụng công tắc "-S" trên sudo. Điều này làm cho sudo nghe mật khẩu trên stdin và ngừng nghe khi thấy một dòng mới.

Ví dụ 1 - Lệnh từ xa đơn giản

Trong ví dụ này, chúng tôi gửi một whoamilệnh đơn giản :

$ ssh user@server cat \| sudo --prompt="" -S -- whoami << EOF
> <remote_sudo_password>
root

Chúng tôi đang nói với sudo đừng đưa ra lời nhắc và lấy đầu vào từ stdin. Điều này làm cho mật khẩu sudo chuyển hoàn toàn im lặng để phản hồi duy nhất bạn nhận được là đầu ra từ whoami.

Kỹ thuật này có lợi ích là cho phép bạn chạy các chương trình thông qua sudo qua ssh mà bản thân chúng yêu cầu đầu vào stdin. Điều này là do sudo đang tiêu thụ mật khẩu qua dòng stdin đầu tiên, sau đó để cho bất kỳ chương trình nào nó chạy tiếp tục lấy stdin.

Ví dụ 2 - Lệnh từ xa yêu cầu stdin của riêng nó

Trong ví dụ sau, lệnh "cat" từ xa được thực thi thông qua sudo và chúng tôi đang cung cấp thêm một số dòng thông qua stdin để con mèo từ xa hiển thị.

$ ssh user@server cat \| sudo --prompt="" -S -- "cat" << EOF
> <remote_sudo_password>
> Extra line1
> Extra line2
> EOF
Extra line1
Extra line2

Đầu ra chứng tỏ rằng <remote_sudo_password> dòng đang được sử dụng bởi sudo và con mèo được thực hiện từ xa sau đó sẽ hiển thị các dòng phụ.

Một ví dụ về nơi điều này sẽ có lợi là nếu bạn muốn sử dụng ssh để truyền mật khẩu cho một lệnh đặc quyền mà không sử dụng dòng lệnh. Nói, nếu bạn muốn gắn một container được mã hóa từ xa qua ssh.

Ví dụ 3 - Gắn một thùng chứa VeraCrypt từ xa

Trong tập lệnh ví dụ này, chúng tôi đang gắn một bộ chứa VeraCrypt từ xa thông qua sudo mà không có bất kỳ văn bản nhắc nhở nào:

#!/bin/sh
ssh user@server cat \| sudo --prompt="" -S -- "veracrypt --non-interactive --stdin --keyfiles=/path/to/test.key /path/to/test.img /mnt/mountpoint" << EOF
SudoPassword
VeraCryptContainerPassword
EOF

Cần lưu ý rằng trong tất cả các ví dụ dòng lệnh ở trên (mọi thứ trừ tập lệnh), << EOFcấu trúc trên dòng lệnh sẽ khiến mọi thứ được nhập, bao gồm cả mật khẩu, được ghi lại cục bộ .bash_history của máy . Do đó, rất khuyến khích rằng để sử dụng trong thế giới thực, bạn nên sử dụng hoàn toàn thông qua một tập lệnh, như ví dụ veracrypt ở trên, hoặc, nếu trên dòng lệnh thì hãy đặt mật khẩu vào một tệp và chuyển hướng tệp đó qua ssh.

Ví dụ 1a - Ví dụ 1 Không có mật khẩu dòng lệnh cục bộ

Ví dụ đầu tiên sẽ trở thành:

$ cat text_file_with_sudo_password | ssh user@server cat \| sudo --prompt="" -S -- whoami
root

Ví dụ 2a - Ví dụ 2 không có mật khẩu dòng lệnh cục bộ

và ví dụ thứ hai sẽ trở thành:

$ cat text_file_with_sudo_password - << EOF | ssh va1der.net cat \| sudo --prompt="" -S -- cat
> Extra line1
> Extra line2
> EOF
Extra line1
Extra line2

Đặt mật khẩu vào một tệp riêng là không cần thiết nếu bạn đặt toàn bộ nội dung trong tập lệnh, vì nội dung của tập lệnh không kết thúc trong lịch sử của bạn. Tuy nhiên, nó vẫn có thể hữu ích trong trường hợp bạn muốn cho phép người dùng không nhìn thấy mật khẩu để thực thi tập lệnh.


Trong lệnh từ xa ssh, tại sao bạn cần phải thực thi catvà chuyển các kết quả thành sudo? Bạn chỉ có thể sử dụng sudonhư lệnh ssh từ xa chính?
joanpau

@joanpau Chữ cái đầu catđược sử dụng để chuyển mật khẩu của người dùng qua sudo ở phía bên kia. Nếu người dùng có thể chạy sudo mà không cần mật khẩu thì không bắt buộc, nhưng tôi không đề xuất cấu hình này. Lý do nó được đặt ra là để ngăn mật khẩu hiển thị trên dòng lệnh của sysrtem từ xa. Các dòng lệnh không an toàn, bất kỳ người dùng nào cũng có thể thấy mọi dòng lệnh với ps auxwww.
Kurt Fitzner

Tôi đang yêu cầu catlệnh ssh cat \| sudo --prompt="" -S.... Nếu các -Slực lượng sudođọc mật khẩu từ stdin, con mèo và ống có cần thiết không? Lệnh ssh có thể đơn giản là sudo --prompt="" -S...?
joanpau

@jonpau Lệnh mèo đó đang lấy stdin và chuyển nó qua sudo để truyền mật khẩu sudo. Nó cho thấy cách bạn có thể chuyển mật khẩu sudo qua ssh qua stdin một cách an toàn.
Kurt Fitzner

1

Cách tốt nhất là ssh -t user@server "sudo <scriptname>", ví dụssh -t user@server "sudo reboot" . Nó sẽ nhắc mật khẩu cho người dùng trước rồi mới root (vì chúng tôi đang chạy tập lệnh hoặc lệnh với quyền root.

Tôi hy vọng nó đã giúp và xóa tan nghi ngờ của bạn.



0
echo $VAR_REMOTEROOTPASS | ssh -tt -i $PATH_TO_KEY/id_mykey $VAR_REMOTEUSER@$varRemoteHost 
echo \"$varCommand\" | sudo bash

2
... Và vui lòng cung cấp giải thích cho mã của bạn.
pppery

-1

Tôi đã đối mặt với một vấn đề,

user1@server1$ ssh -q user1@server2 sudo -u user2 rm -f /some/file/location.txt

Output:
sudo: no tty present and no askpass program specified

Sau đó tôi đã thử với

#1
vim /etc/sudoers
Defaults:user1    !requiretty

không làm việc

#2
user1   ALL=(user2)         NOPASSWD: ALL

Điều đó đã làm việc đúng!


Điều này không thực sự hoàn thành những gì đang được yêu cầu. Ý tưởng là vẫn yêu cầu mật khẩu, nhưng cho phép nó được gõ trên ssh. Những gì bạn đã làm chỉ là cho user1 toàn quyền truy cập sudo vào user2 mà không cần mật khẩu. Điều này tốt cho các ứng dụng cụ thể, nhưng không phải là ý tưởng tốt nhất như một giải pháp chung.
Possum

-7

Tùy thuộc vào cách sử dụng của bạn, tôi đã thành công với những điều sau đây:

ssh root@server "script"

Điều này sẽ nhắc nhập mật khẩu gốc và sau đó thực hiện lệnh chính xác.


26
Yike, SSH là root? Đó là một ý tưởng tồi cho tất cả các loại lý do.
darkfeline

12
Hãy nhớ ssh không phải là telnet. Ssh không còn nguy hiểm khi root bằng ssh với tư cách là người dùng khác và chạy sudo. Mật khẩu của bạn được mã hóa theo cùng một cách qua kết nối ssh.
Stéphane

22
Stéphane hoàn toàn chính xác về bảo mật mật khẩu. Tuy nhiên, bằng cách sử dụng root thay vì sudo, bạn sẽ mất dấu vết kiểm toán đi với sudo. Ngoài ra, quyền truy cập root có thể không có sẵn.
djeikyb
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.