Shell Script để đăng nhập vào máy chủ ssh


29

Tôi đã thử viết một tập lệnh shell có thể tự động đăng nhập vào máy chủ ssh bằng mật khẩu được đề cập trong tập lệnh. Tôi đã viết mã sau đây:

set timeout 30
/usr/bin/ssh -p 8484 root@172.31.72.103
expect 
{
   "root@172.31.72.103's password" 
   {
      send "password\r" 
   }
}

Mã này không chạy đúng, vẫn đang hỏi mật khẩu. Ai đó có thể vui lòng giúp tôi giải quyết điều này



Câu trả lời:


36

Tôi đã từng viết một expecttập lệnh để đăng nhập vào máy chủ ssh (như trường hợp của bạn) và tập lệnh của tôi là như thế này:

#!/usr/bin/expect

spawn ssh MyUserName@192.168.20.20
expect "password"
send "MyPassword\r"
interact

Tôi nghĩ có lẽ interactthiếu trong kịch bản của bạn.


này hoàn toàn được làm việc tốt cho tôi và tôi bị mắc kẹt ở nơi này, các tương tác cung cấp thiết bị đầu cuối tương tác với dấu nhắc, nhưng tôi đang cố gắng để tự động thêm nhiều bước thích làm cdlsvà đọc nội dung của tập tin là tốt. Có thể làm sau khi tương tác? Vui lòng trả lời
Hansiemithun

@Hansie bạn có thể gửi lslệnh sau khi đăng nhập. Ví dụ: sau khi gửi mật khẩu, hãy thực hiện expectvới văn bản nhắc lệnh (để đảm bảo bạn đã đăng nhập), sau đó send "ls\r". Tất cả những điều này đi trước interact.
saeedn

Câu hỏi hơi sai và tôi xin lỗi sau khi làm ls và đọc nội dung, tôi có thể in như vậy. Nhưng làm thế nào để đưa nó ra khỏi phiên ssh thành một biến để truy cập từ máy cục bộ. ref: stackoverflow.com/questions/32341234/Exect-script-return-value . Nhưng đầu ra không làm việc cho tôi. Câu hỏi của tôi được đăng: stackoverflow.com/questions/51628465/ . Tôi cần file_listsau khi thoát để truy cập từ dấu nhắc lệnh cục bộ
Hansiemithun

31

Bạn đang đi về nó sai cách. Những gì bạn muốn làm là tạo một cặp ssh-key không mật khẩu và sau đó (miễn là máy chủ hỗ trợ xác thực khóa RSA), bạn có thể nhận được mà không cần phải nhập mật khẩu cho tất cả. Đây là một rủi ro bảo mật nếu khóa riêng của bạn được lưu trữ ở đâu đó mà nó có thể bị đánh cắp.

Thực hiện theo các bước sau:

  1. mkdir -p ~/.ssh
  2. cd ~/.ssh
  3. ssh-keygen -type dsa -i mysshkeys
  4. nhấn Return khi được nhắc nhập cụm mật khẩu
  5. nhấn Return lần thứ hai để xác nhận.

Bây giờ sẽ có hai tệp trong của bạn ~/.ssh thư mục , mysshkey.pubmysshkey. mysshkey.publà khóa công khai của bạn, khóa này an toàn để đặt trên các máy chủ từ xa. mysshkeylà khóa mật khẩu riêng tư của bạn, nó là không an toàn khi đặt trên các máy chủ từ xa (hoặc nơi nào đó người khác có thể nhận được một bản sao).

Trên máy chủ bạn muốn SSH vào:

  1. Đăng nhập vào máy chủ từ xa
  2. mkdir -p ~/.ssh
  3. Sao chép và dán nội dung mysshkey.pubvào~/.ssh/authorized_keys
  4. Hãy chắc chắn rằng đó ~/.ssh/authorized_keyschmod 'd600

Bây giờ, để đưa nó vào hoạt động trên máy cục bộ của bạn, bạn chạy lệnh sau:

ssh -i ~/.ssh/mysshkey <remote_server_ip>

Và bạn sẽ đăng nhập mà không được nhắc nhập mật khẩu.

Đây là một phương pháp quản lý đăng nhập tự động được ưu tiên hơn nhiều vì bạn không mã hóa mật khẩu nhiều nơi cần được cập nhật nếu bạn thay đổi nó.


2
Tôi sẽ sử dụng các khóa RSA chứ không phải DSA. Nhưng khác hơn, hoàn toàn đồng ý.
glglgl

12
đôi khi bạn không thể thêm khóa vào máy chủ từ xa, ví dụ như các thiết bị mạng.
DarkHeart

1
Tôi đã thử điều này. ssh vẫn đang yêu cầu nhập mật khẩu Bạn có đặc biệt phải cung cấp một địa chỉ IP? Tôi đã thử nó với cả <user> @ <tên miền> và chỉ tên miền.
Jay Biênvenu

Lệnh này nói quá nhiều đối số? (cho bước 3)
Joseph Astrahan

Tôi đã phải thay đổi thành ssh-keygen -t dsa và nhập thủ công vị trí tệp thay thế.
Joseph Astrahan

20

Trên các bản phân phối dựa trên Debian, sshpassgói cung cấp một cách dễ dàng hơn để làm những gì bạn muốn. Gói có sẵn cho nhiều bản phân phối phổ biến khác. Bạn cần thiết lập nó trước:

echo 'YourPassword' > passwordFile.txt
chmod 600 passwordFile.txt

Sau đó gọi lệnh SSH từ một tập lệnh như thế này:

sshpass -f /path/to/passwordFile.txt /usr/bin/ssh -p 8484 root@172.31.72.103

Điều này cung cấp sự linh hoạt hơn, chẳng hạn như nếu bạn đang sử dụng một ngôn ngữ khác hoặc cần thay đổi mật khẩu, hơn là các giải pháp sử dụng expect.


7

Đầu tiên cài đặt sshPass sudo apt-get install sshpass

Sau đó tạo bí danh trong tệp .bashrc dưới dạng

alias sshLogin='sshpass -p <your ssh password> ssh username@remote_host'

Bây giờ tải lại tệp .bashrc đã thay đổi của bạn bằng cách source ~/.bashrc

Bây giờ bạn đã hoàn thành.

Bây giờ bạn có thể chạy ssh bằng cách sử dụng bí danh đã tạo ở trên sshLogintrong terminal.



2

Tất cả những gì bạn cần nó để tạo một khóa băm và lưu nó trên PC của bạn

Chỉ loại

ssh-keygen -t rsa -b 4096 # just press Enter till the end

sau đó nhập

ssh-copy-id <user>@<server>

sau đó đăng nhập bình thường bằng

ssh <user>@<server>

Bây giờ bạn không cần mật khẩu

Lưu ý: Lưu mật khẩu của bạn trong một văn bản đơn giản là nguy hiểm

Phương pháp này đang tạo ra một giá trị băm của mật khẩu của bạn bằng RSA với khóa công khai có độ dài 4096 rất an toàn.


1
Điều này dường như là một sự lặp lại của câu trả lời này .
roaima

#roaima Có, nhưng nó cho thấy lệnh cực kỳ hữu ích ssh-copy-id, mà không ai khác đề cập. Tôi ủng hộ nó cho điều đó.
Huw Walters

1

SSH đăng nhập không cần mật khẩu bằng SSH Keygen trong 5 bước đơn giản :

Thiết lập môi trường: enter image description here

Bước 1: Xác thực Khóa SSH-Kegen trên - (192.168.0.12)
Lần đầu tiên đăng nhập vào máy chủ 192.168.0.12 với người dùng và tạo một cặp khóa công khai bằng lệnh sau.

enter image description here

Bước 2: Tạo thư mục .ssh trên - 192.168.0.11
Sử dụng SSH từ máy chủ 192.168.0.12 để kết nối máy chủ 192.168.0.11 để tạo thư mục .ssh bên dưới nó, sử dụng lệnh sau.

enter image description here

Bước 3: Tải lên Khóa công khai được tạo thành - 192.168.0.11
Sử dụng SSH từ máy chủ 192.168.0.12 và tải lên khóa công khai mới được tạo (id_rsa.pub) trên máy chủ 192.168.0.11 trong .sshthư mục của người dùng dưới dạng tên tệp ủy quyền.

enter image description here

Bước 4: Đặt quyền trên - 192.168.0.11
Do các phiên bản SSH khác nhau trên máy chủ, chúng tôi cần đặt quyền trên .sshthư mục và authorized_keystệp.

enter image description here

Bước 5: Đăng nhập từ 192.168.0.12 đến 192.168.0.11 Máy chủ không có mật khẩu
Từ giờ trở đi chúng ta có thể đăng nhập vào 192.168.0.11 với tư cách là người dùng sheena từ máy chủ 192.168.0.12 với tư cách là người dùng tecmint không có mật khẩu.

enter image description here


Cảm ơn ... điều này đã làm việc với tôi, ngoại trừ ở bước 4, tôi đã nhận được một "cảnh báo" đầy kịch tính: "FILE KEY RIÊNG TƯ KHÔNG GIỚI HẠN! ... ... /. Ssh / id_rsa 'quá mở. ... khóa riêng sẽ được bỏ qua ... quyền xấu ". Tôi đã làm chmod 700 id_rsatrong thư mục .ssh trong máy chủ cục bộ (máy khách, tức là 192.168.0.12 trong ví dụ của bạn): vấn đề đã được giải quyết
mike gặm nhấm


1

Như đã mô tả trong các câu trả lời khác, tôi cũng sử dụng sshpassnhưng tôi kết hợp nó với readlệnh để lưu mật khẩu của mình trong một biến môi trường tạm thời. Bằng cách này, mật khẩu của tôi không bao giờ được viết ở bất cứ đâu rõ ràng. Đây là lệnh một dòng tôi sử dụng:

read -s PASS; sshpass -p $PASS ssh <user>@<host adress>

Sau đó, bạn phải nhập mật khẩu của mình (không có gì xuất hiện trên màn hình) và sau đó nhấn enter sẽ mở kết nối.


0

Gần đây tôi đã làm điều này, điều này có thể giúp bạn:

sshpass -p 'password' username@ipaddress

nếu điều này không hoạt động thì bạn sẽ phải tạo các khóa trong máy khác mà bạn muốn kết nối với

ssh-keygen

nó sẽ tạo các khóa riêng và khóa chung và yêu cầu bạn cho một vị trí, để trống, nó sẽ lưu các khóa trong thư mục .ssh theo mặc định nó sẽ yêu cầu bạn nhập mật khẩu, bạn cũng có thể để trống trong thư mục .ssh và thay đổi tên khóa công khai thành 'ủy quyền'

cd .ssh/
mv id_rsa.pub authorized_keys
useradd -d /home/username username

Điều này sẽ thêm người dùng vào danh sách bây giờ vào thư mục chính và cho phép và khởi động lại dịch vụ sshd

chmod 700 /home/username/.ssh
chmod 644 /home/username/.ssh/authorized_keys
chown root:root /home/dozee
sudo service sshd restart

bây giờ bạn sẽ phải di chuyển khóa riêng tới hệ thống tại vị trí đó từ nơi bạn sẽ chạy lệnh ssh, sau đó bạn có thể kết nối với

sshpass -p 'password' ssh -i id_rsa username@ip

nếu thậm chí nó không hoạt động thì hãy vào / etc / ssh mở sshd_config với trình soạn thảo vim kiểm tra xem pubkeyAuthenticatoin có được chuyển thành có hay không, nếu không thay đổi thành có, hãy khởi động lại dịch vụ sshd và sau đó thử, nó chắc chắn sẽ hoạt động .


0

Đối số đầu tiên là tên máy chủ và thứ hai là mật khẩu.

     #!/usr/bin/expect
     set pass [lindex $argv 1]
     set host [lindex $argv 0]
     spawn ssh -t root@$host echo Hello
     expect "*assword: "
     send "$pass\n";
     interact

Thi hành: ./script.Exect

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.