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 whoami
lệ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), << EOF
cấ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.
ssh <user@server> sudo <script>
, vì tôi đã nhận được lỗisudo: no tty present and no askpass program specified