Làm cách nào để chuyển mật khẩu sang su / sudo / ssh mà không ghi đè TTY?


148

Tôi đang viết một chương trình C Shell sẽ được thực hiện suhay sudohay ssh. Tất cả họ đều muốn mật khẩu của mình trong đầu vào giao diện điều khiển (TTY) chứ không phải stdin hoặc dòng lệnh.

Có ai biết một giải pháp?

Thiết lập không cần mật khẩu sudokhông phải là một lựa chọn.

có thể là một lựa chọn, nhưng nó không có trong hệ thống rút gọn của tôi.



Câu trả lời:


215

Đối với sudo, có tùy chọn -S để chấp nhận mật khẩu từ đầu vào tiêu chuẩn. Đây là mục người đàn ông:

    -S          The -S (stdin) option causes sudo to read the password from
                the standard input instead of the terminal device.

Điều này sẽ cho phép bạn chạy một lệnh như:

echo myPassword | sudo -S ls /tmp

Đối với ssh, tôi đã thực hiện nhiều nỗ lực để tự động hóa / kịch bản sử dụng mà không thành công. Dường như không có cách tích hợp nào để truyền mật khẩu vào lệnh mà không cần nhắc. Như những người khác đã đề cập, tiện ích " mong đợi " có vẻ như nhằm mục đích giải quyết vấn đề nan giải này, nhưng cuối cùng, thiết lập ủy quyền khóa riêng là cách chính xác để thực hiện khi cố gắng tự động hóa việc này.


2
May mắn thay, Ruby có một máy khách SSH tích hợp cho phép bạn chỉ định mật khẩu. Bạn có thể thử ruby ​​-e "yêu cầu 'net / ssh'; Net :: SSH.start ('example.com', 'test_user' ,: password => 'secret') do | ssh | đặt 'Đã đăng nhập thành công'; trong khi cmd = got; đặt ssh.exec! (cmd); end end "
user1158559

13
Tôi ghét phải là một người dự tiệc ở đây, nhưng làm điều này có thể làm cho mật khẩu của bạn hiển thị trong một danh sách quy trình. Tôi đã cố gắng xác định một cách tốt hơn và tình cờ thấy bài viết này và ngạc nhiên không ai chỉ ra điều đó. Giải pháp tuyệt vời, nhưng hãy cẩn thận với những rủi ro.
Matt

Về ssh, bạn đã thử chuyển mật khẩu trong chuỗi kết nối chưa? như thế nonroot:yourpassword@hostname.comnào Tất nhiên mọi thứ sẽ dễ dàng hơn nhiều nếu bạn sử dụng khóa auth và trình quản lý khóa.
Killah

12
Tránh mật khẩu hiển thị trong danh sách quy trình hoặc tệp nhật ký bằng cách đặt nó vào một tệp và sử dụng mèo; 'cat pw | sudo -S <command>, Và sau đó rm pw.
CAB

Một cách khác là sử dụng netcat và cung cấp mật khẩu qua ổ cắm - nc -l 12345 | sudo -S <command>. Về phía gửi; echo myPassord | nc <target> 12345. Điều này chỉ di chuyển vấn đề xử lý mật khẩu, nhưng có lẽ là đến một bảng điều khiển chính nơi bạn có nhiều tùy chọn hơn.
CAB

36

Tôi đã viết một số Applescript để nhắc mật khẩu thông qua hộp thoại và sau đó xây dựng lệnh bash tùy chỉnh, như sau:

echo <password> | sudo -S <command>

Tôi không chắc chắn nếu điều này giúp.

Thật tuyệt nếu sudo chấp nhận mật khẩu được mã hóa trước, vì vậy tôi có thể mã hóa nó trong tập lệnh của mình và không lo lắng về việc lặp lại mật khẩu văn bản rõ ràng xung quanh. Tuy nhiên điều này làm việc cho tôi và tình hình của tôi.


27

Đối với sshbạn có thể sử dụng sshpass: sshpass -p yourpassphrase ssh user@host.

Bạn chỉ cần tải xuống sshpass trước :)

$ apt-get install sshpass
$ sshpass -p 'password' ssh username@server

12

Tôi có:

ssh user@host bash -c "echo mypass | sudo -S mycommand"

Làm việc cho tôi.


Không làm việc cho tôi. vẫn ssh nhắc nhập mật khẩu.
AKS

Tuyệt vời, cuối cùng là thứ tôi có thể sử dụng! Cảm ơn. Tôi sử dụng điều này trong một tập lệnh bash bắt đầu một phiên ssh và truyền các lệnh sudo cho máy khách. Kịch bản của tôi có các dòng giải quyết: ssh -t username @ hostname bash -c "sudo echo fartjuice"
James T Snell

12

Đối với sudo bạn cũng có thể làm điều này:

sudo -S <<< "password" command

10

Giải pháp thông thường cho vấn đề này là thiết lập một ứng dụng trợ giúp thực hiện nhiệm vụ yêu cầu truy cập siêu người dùng: http://en.wikipedia.org/wiki/setuid

Sudo không có nghĩa là được sử dụng ngoại tuyến.

Chỉnh sửa sau: SSH có thể được sử dụng với xác thực khóa riêng-công khai. Nếu khóa riêng không có cụm mật khẩu, ssh có thể được sử dụng mà không cần nhắc mật khẩu.


10

Điều này có thể được thực hiện bằng cách thiết lập khóa chung / riêng trên máy chủ đích bạn sẽ kết nối. Bước đầu tiên sẽ là tạo khóa ssh cho người dùng đang chạy tập lệnh trên máy chủ cục bộ, bằng cách thực hiện:

ssh-keygen
Enter file in which to save the key (/home/myuser/.ssh/id_rsa): <Hit enter for default>
Overwrite (y/n)? y

Sau đó nhập mật khẩu trống. Sau đó, sao chép khóa ssh của bạn vào máy chủ đích mà bạn sẽ kết nối.

ssh-copy-id <remote_user>@<other_host>
remote_user@other_host's password: <Enter remote user's password here>

Sau khi đăng ký các khóa ssh, bạn sẽ có thể thực hiện im lặng ssh remote_user@other_hosttừ máy chủ lưu trữ cục bộ của mình.


7

Có lẽ bạn có thể sử dụng một expectlệnh?:

expect -c 'spawn ssh root@your-domain.com;expect password;send "your-password\n";interact

Lệnh đó cho mật khẩu tự động.


Trông thật tuyệt, nhưng làm cách nào tôi có thể kích hoạt lệnh mong đợi trên maschine mà không có quyền root?
Radon8472

1
@ Radon8472 Một thực thi có thể được thêm vào ~ / bin nếu bạn không có quyền cài đặt nó. Nếu hệ thống của bạn không tự động thêm ~ / bin vào PATH của bạn, bạn có thể thực hiện thủ công với export PATH = "$ PATH: ~ / bin" hoặc thêm lệnh đó vào hồ sơ của bạn để tự động thực hiện. Nếu bạn không muốn thay đổi PATH của mình, thay vào đó, bạn có thể thực thi lệnh bằng đường dẫn tuyệt đối của nó: ~ / bin / mong đợi [đối số] Hãy nhớ đặt bit thực thi của nó: chmod + x ~ / bin / mong đợi
StarCrashr

6

Khi không có lựa chọn nào tốt hơn (như đề xuất của người khác), thì man socat có thể giúp:

   (sleep 5; echo PASSWORD; sleep 5; echo ls; sleep 1) |
   socat - EXEC:'ssh -l user server',pty,setsid,ctty

          EXEC’utes an ssh session to server. Uses a pty for communication
          between socat and ssh, makes it ssh’s  controlling  tty  (ctty),
          and makes this pty the owner of a new process group (setsid), so
          ssh accepts the password from socat.

Tất cả sự phức tạp của pty, setsid, ctty là cần thiết và, trong khi bạn có thể không cần ngủ lâu, bạn sẽ cần ngủ. Tùy chọn echo = 0 cũng đáng xem, cũng như truyền lệnh từ xa trên dòng lệnh của ssh.


1
Điều này thực sự sẽ làm việc cho sulà tốt. sukhông có tùy chọn -S (stdin).
aus

Có thể tránh ngủ và sử dụng một cái gì đó đáng tin cậy hơn thay thế?
Michael Pankov

6

Hãy xem expecttiện ích linux.

Nó cho phép bạn gửi đầu ra đến stdio dựa trên khớp mẫu đơn giản trên stdin.


1

Thiết lập SSH cho Xác thực khóa công khai, không có cụm từ trên khóa. Tải các hướng dẫn trên mạng. Bạn sẽ không cần mật khẩu để đăng nhập. Sau đó, bạn có thể giới hạn kết nối cho một khóa dựa trên tên máy chủ của khách hàng. Cung cấp bảo mật hợp lý và tuyệt vời cho đăng nhập tự động.


1
ssh -t -t me@myserver.io << EOF
echo SOMEPASSWORD | sudo -S do something
sudo do something else
exit
EOF

Nếu bạn có thể đăng nhập với tư cách là người dùng bằng khóa ssh, để truy cập sudo vẫn ổn: ssh -t user @ host "echo mypassword | sudo -S sudocommand"
Jack

0

Tôi đã từng gặp vấn đề tương tự. kịch bản hộp thoại để tạo thư mục trên pc từ xa. hộp thoại với ssh rất dễ dàng. Tôi sử dụng sshpass (đã cài đặt trước đó).

   dialog --inputbox "Enter IP" 8 78 2> /tmp/ip

   IP=$(cat /tmp/ip)


   dialog --inputbox "Please enter username" 8 78 2> /tmp/user

   US=$(cat /tmp/user)


   dialog --passwordbox "enter password for \"$US\" 8 78 2> /tmp/pass

   PASSWORD = $(cat /tmp/pass)


   sshpass -p "$PASSWORD" ssh $US@$IP mkdir -p /home/$US/TARGET-FOLDER


   rm /tmp/ip

   rm /tmp/user

   rm /tmp/pass

Lời chào từ nước Đức

Tít


0

Dựa trên câu trả lời của @ Jahid, điều này hiệu quả với tôi trên macOS 10.13:

ssh <remote_username>@<remote_server> sudo -S <<< <remote_password> cat /etc/sudoers

0

một sshpasslựa chọn tốt hơn là: passh https://github.com/clarkwang/passh

Đăng nhập vào một máy chủ từ xa

 $ passh -p password ssh user@host

Chạy một lệnh trên máy chủ từ xa

 $ passh -p password ssh user@host date

phương pháp khác để vượt qua mật khẩu

-p Mật khẩu (Mặc định: `password ')

-p env: Đọc mật khẩu từ env var

Tập tin -p: Đọc mật khẩu từ tập tin

Ở đây tôi đã giải thích tại sao nó tốt hơn sshpass và các giải pháp khác.


-1
echo <password> | su -c <command> <user> 

Đây là làm việc.


1
Đây là người duy nhất làm việc cho tôi ở Fedora. Mọi người downvote câu trả lời chỉ vì họ không làm việc trong tình huống của họ?
Hangchen Yu

2
"su: phải được chạy từ thiết bị đầu cuối" (RPi1B, Raspbian)
notme1560

Thật không may, điều này không có trong các phiên bản gần đây su, mà đọc mật khẩu từ stdio thay thế.
moutonjr

-1

Mã hóa mật khẩu trong một tập lệnh mong đợi cũng giống như có một sudo không mật khẩu, thực sự tệ hơn, vì sudo ít nhất ghi lại các lệnh của nó.



-1

SỬ DỤNG:

echo password | sudo command

Thí dụ:

echo password | sudo apt-get update; whoami

Hy vọng nó giúp..


-2

Bạn có thể cung cấp mật khẩu làm tham số để mong đợi tập lệnh.


-11
su -c "Command" < "Password"

Hy vọng nó hữu ích.


1
Nó không thể. "su: phải được chạy từ một thiết bị đầu cuối" là câu trả lời cho điều này.
thelogix
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.