Cách SSH trong một dòng


26

Làm cách nào để kết nối với máy tính khác thông qua SSH trong một dòng? Nếu tôi phải làm ssh host@IP, nó sẽ yêu cầu tôi nhập mật khẩu vào dòng thứ hai. Tôi đã nghĩ rằng tôi có thể làm một cái gì đó như thế này: ssh host@IP | echo passwordnhưng điều đó đặt mật khẩu vào trước khi yêu cầu mật khẩu.


3
Kiểu suy nghĩ này xuất phát từ thời của telnet và mong đợi, trở lại khi internet là một nơi an toàn hơn. Câu trả lời của Allen là chính xác, câu trả lời của Jakuje là đúng về mặt kỹ thuật nhưng không phải là công cụ cho công việc ở hầu hết các nơi.
Criggie

3
Đây là một câu hỏi hay để thiết lập đăng nhập không mật khẩu. Tôi yêu cầu bạn xem lại câu trả lời được chấp nhận của bạn. Câu trả lời của Jakuje là chính xác và sẽ hoạt động, cách thích hợp để thực hiện điều này là với các khóa SSH, được mô tả trong câu trả lời của Allan.
Scot

Nếu sshsẽ đọc mật khẩu từ stdin, thì echo password | ssh host@IPnó sẽ hoạt động, nhưng thường thì SSH cố đọc trực tiếp từ thiết bị đầu cuối.
Paŭlo Ebermann

Câu trả lời:


82

Bạn nên sử dụng các khóa SSH để xác thực thay vì đặt mật khẩu của bạn trên dòng lệnh vì nó cực kỳ không an toàn.

Cách thức hoạt động này là khi bạn đã thiết lập các khóa SSH, tất cả những gì bạn phải làm là đưa ra lệnh:

ssh user@host

và không cần gõ một thứ khác, bạn sẽ được đăng nhập tự động.


Sao chép khóa công khai SSH sang Mac / FreeBSD / Linux từ macOS

Điều này giả định rằng bạn có quyền truy cập vào máy chủ từ xa thông qua xác thực dựa trên mật khẩu (nhập mật khẩu) và rằng bạn đã tạo cặp khóa riêng / công khai (nếu không, xem bên dưới). Trong ví dụ sau, chúng tôi đang sử dụng RSA. Để bắt đầu, hãy sao chép khóa (lưu ý rằng thư mục "home" khác nhau giữa macOS, Linux, BSD, v.v.):

Sử dụng SCP:

scp ~/.ssh/id_rsa.pub username@hostname:/Users/username/.ssh/

Hoặc chỉ đơn giản là đưa tệp vào authorized_keys(Tôi thích phương thức này):

cat id_rsa.pub | ssh username@hostname ' cat >>.ssh/authorized_keys'

(Tên khóa của bạn có thể khác nhau) Nếu thư mục .ssh không tồn tại trên máy chủ từ xa, bạn sẽ cần phải đăng nhập và tạo nó.

Bây giờ khóa đã được sao chép từ mac sang máy chủ từ xa . Đặt quyền chính xác cho Khóa công khai SSH trên máy chủ từ xa:

chmod 600  ~/.ssh/id_rsa.pub

Tiếp theo thêm khóa vào tệp SSH ủy quyền, nếu tệp không tồn tại, hãy tạo nó.

Nếu tệp authorized_keysđã tồn tại trong ~/.sshlệnh sử dụng sau:

cat id_rsa.pub >> authorized_keys

Nếu tệp không tồn tại, hãy nhập các lệnh sau:

cat id_rsa.pub > authorized_keys

chmod 600 authorized_keys
chown user:group authorized_keys


Tạo khóa công khai / riêng tư trên macOS

Mở Terminal bằng cách vào Ứng dụng -> Tiện ích -> Terminal

Trong thiết bị đầu cuối, sử dụng lệnh sau để bắt đầu tạo khóa

ssh-keygen -t rsa

Tiếp theo, bạn sẽ được nhắc cung cấp vị trí bạn muốn tạo tệp khóa riêng:

Nhập tệp để lưu khóa ( /Users/username/.ssh/id_rsa):

Để trống phần này để tạo khóa ở vị trí mặc định /Users/username/.ssh/id_rsa. Tệp khóa công khai sẽ được tạo ở cùng một vị trí và có cùng tên, nhưng với phần mở rộng .PUB.

Sau khi bạn sẽ được nhắc chọn một cụm mật khẩu. Đây là mật khẩu tùy chọn để sử dụng khóa riêng.

Enter passphrase (empty for no passphrase):

Khóa SSH của bạn được tạo.

Bây giờ, hãy nhớ, nếu bạn đặt một cụm mật khẩu, bạn sẽ được yêu cầu nhập nó mỗi khi bạn kết nối. Tiện ích ssh-agentsẽ giữ cụm mật khẩu trong bộ nhớ giảm bớt nhu cầu nhập thủ công mỗi khi bạn kết nối trong khi bạn ở trong cùng một phiên. Để biết thêm chi tiết, xemman ssh-agent


6
Hoàn toàn điều này - các khóa có thể và nên thay thế hoàn toàn mật khẩu cho mọi truy cập ssh qua internet. Tôi khuyên bạn nên mở rộng về nhu cầu bảo mật của khóa riêng, rằng đó không phải là thứ cần thiết trên tất cả các máy tính của bạn.
Criggie

+1 Đây là một câu trả lời thực sự tốt, không chỉ vì những gì nó nói, mà còn vì cách bạn giải thích nó. Bất cứ điều gì người dùng dễ theo dõi hơn và giúp họ an toàn hơn là điểm cộng trong sách của tôi!
Monomeeth

7
Câu trả lời chính xác. Chỉ muốn thêm rằng đó ssh-copy-idlà một công cụ tốt để tự động hóa một số ở trên.
Scot

Một đề cập đến ssh-agent cũng có thể giúp đỡ. Hầu hết (tất cả?) Các phiên bản OS X / macOS đều đi kèm và nó cho phép đăng nhập không cần mật khẩu ngay cả khi khóa được bảo vệ bằng mật khẩu.
Qsigma

1
@Scot - theo mặc định, đây không phải là một phần của macOS và phải được cài đặt qua Homebrew hoặc MacPorts . Tôi không phải là người thích cài đặt phần mềm cho mọi thứ có thể được thực hiện trong 1 dòng hoặc một đoạn script ngắn, tự viết và vì những lý do đó tôi nghĩ rằng nó nằm ngoài phạm vi của câu trả lời. Tuy nhiên, đó là một tiện ích nhỏ tốt và đáng nói.
Allan

13

Có một số khả năng. Ví dụ của bạn rõ ràng sẽ không hoạt động, nhưng bạn có thể đạt được điều gì đó tương tự bằng cách sử dụng sshpasstiện ích:

sshpass -p password ssh host@IP

Lưu ý, điều này không được khuyến khíchpasswordsẽ hiển thị cho các quy trình khác hoặc trong lịch sử trình bao.

Một cách tốt hơn để làm điều tương tự là thiết lập xác thực không mật khẩu bằng các khóa SSH. Nói ngắn gọn:

ssh-keygen -t rsa -f ~/.ssh/id_rsa
ssh-copy-id IP

Tôi đã thử sshpassnhư bạn đề nghị, nhưng nó nói lệnh không tìm thấy.
Ben A.

8
Chà ... Bạn có thể sẽ phải cài đặt nó. Và không, tôi không khuyên bạn nên nó. Thiết lập xác thực không mật khẩu bằng các phím ssh.
Jakuje

4
@BenA. thiết lập xác thực không mật khẩu bằng cách xác định bàn phím chung / riêng và thiết lập nó trên cả hai máy liên quan. Điều đó dễ dàng hơn nhiều (và thực sự an toàn hơn) so với bất kỳ mật khẩu nào
nohillside

8
Một ngàn lần không. sshpass là một hack bẩn được sử dụng để kết nối với các thiết bị nói ssh nhưng không thực hiện đúng các phím và công dụng chính của nó là các tập lệnh thiết lập. Bạn sẽ không sử dụng sshpass trên máy nhiều người dùng ps auxw | grep sshpass sẽ cho người dùng khác biết mật khẩu ssh.
Criggie

1
@Criggie, không hoàn toàn. Trong khi tôi đứng sau giải pháp dựa trên khóa 100%, tôi có một số Raspberry Pis chỉ dành cho nội bộ (đối với các tác vụ ngẫu nhiên và được truy cập bởi các khách hàng ngẫu nhiên; chuyển các khóa xung quanh chỉ để sử dụng nội bộ là một rắc rối). Chạy lệnh của bạn cho đầu ra sau : pi@sshbox:~ $ ps auxw | grep sshpass pi 4891 0.0 0.3 2256 1560 pts/0 S+ 06:29 0:00 sshpass -p zzzzzzzz ssh pi@192.168.0.208. Là zzzzzzzznghĩa đen; sshpass che giấu nội dung của mật khẩu. Có lẽ các lần lặp lại trước đó ít nhận thức về quyền riêng tư.
với

3

Tôi đã dành một thời gian dài để tìm câu trả lời cho điều này quá. Mặc dù nó không an toàn và tất cả những người này bảo bạn sử dụng khóa RSA ( đây là một ý tưởng an toàn và đáng tin cậy hơn ), nhưng điều đó hoàn toàn có thể.

Sử dụng một chương trình được gọi expectcho việc này. Mong đợi sẽ xem thiết bị xuất chuẩn (và tôi nghĩ thiết bị lỗi chuẩn nếu được cấu hình đúng) cho bạn, chờ đợi một số thông báo nhất định và trả lời chúng với đầu ra. Mong đợi bản thân nó thực sự là một ngôn ngữ kịch bản, và khi tôi đang làm điều tương tự, tôi đã rất khó khăn để kịch bản của chính tôi hoạt động đúng vì thời gian. Tuy nhiên, mong đợi cũng bao gồm một tiện ích tiện dụng được gọi là autoexpect.

Với tính năng tự động mở rộng, nó sẽ theo dõi bạn và tạo ra một kịch bản mong đợi cho bạn. Đơn giản chỉ cần chạy tự động khai thác và lệnh bạn muốn:

autoexpect ssh host@ip 

và làm những gì bạn thường làm. Khi bạn thoát khỏi chương trình (bằng cách nhập exitvào ssh'd shell), nó sẽ tạo tập lệnh. Trong trường hợp bạn không muốn toàn bộ tập lệnh bạn đang viết nằm trong tập lệnh mong đợi, bạn có thể chỉnh sửa tập lệnh từ tự động khai thác (được gọi script.exp) để thoát trước khi nhập exitlệnh vào trình bao. Dòng bạn muốn di chuyển để thay đổi kết thúc tập lệnh là:

expect eof

có nghĩa là mong đợi kết thúc của tập tin. Hi vọng điêu nay co ich!


1
Trong trường hợp chưa có ai nói điều đó: Chào mừng bạn đến hỏi khác!
Synoli

2

Việc sử dụng expectchỉ đơn giản là sai khi đăng nhập vào kết nối ssh cho bất kỳ thứ gì khác ngoài bộ kiểm tra.

Những gì @ ben-a đang tìm kiếm đã được triển khai trong ssh. Bí quyết là làm thế nào để sử dụng nó. Vì vậy, ở đây đi:

  1. Tạo một cặp khóa công khai / riêng bằng cách sử dụng ssh-keygen. Sử dụng ECDSA hoặc RSA làm -t(hoặc loại) và đối với RSA, sử dụng 2048 hoặc 4096 làm -b(hoặc độ dài BITS). Điều này sẽ đủ tại thời điểm viết. LUÔN LUÔN sử dụng MẬT KHẨU!
  2. Sử dụng ssh-copy-idhoặc phương pháp được đề cập ở trên để tạo trên máy bạn đang đăng nhập vào (còn gọi là máy chủ) ~/.ssh/authorized_keystệp. Trong đó có một bản sao của khóa công khai bạn vừa tạo.
  3. Bây giờ trên máy bạn sử dụng để đăng nhập vào 'máy chủ' (hoặc máy khách), bạn mở tệp ~/.ssh/config. Nếu nó không tồn tại, bạn có thể tạo nó.
  4. Trong tệp này, bạn thêm các mục sau cho nhu cầu của bạn

    host <name you want to use for this connection>
        Hostname <DNS or IP of the server>
        user <user name you want to use>
        identitiesonly yes
        identityfile <path to the private key>
  5. Bây giờ bạn có thể sử dụng chỉ ssh <name>để thiết lập kết nối, nhưng nó vẫn sẽ cần mật khẩu cho khóa của bạn. Để giải quyết vấn đề này, hãy sử dụng ssh-agent được phát triển và bao gồm cho mục đích này. Để thêm chìa khóa của bạn cho các đại lý chỉ cần sử dụng ssh-add <path to keyfile>. Bạn sẽ được yêu cầu nhập mật khẩu và nó sẽ lưu trữ khóa cho bạn một cách an toàn cho phiên này. Nếu nó mang lại lỗi "không thể tìm thấy tác nhân ssh" (hoặc tương tự), điều đó có nghĩa là có thể tác nhân chưa được khởi động. Bạn có thể bắt đầu nó cho phiên này bằng cách sử dụng ssh-agent bash. Điều này sẽ bắt đầu một lớp vỏ mới với tác nhân hoạt động trong đó.

Khi sử dụng các bước này, bạn không chỉ khiến người khác khó mạo danh bạn hơn bằng cách chiếm đoạt thông tin đăng nhập của bạn, mà còn giữ khả năng sử dụng theo thứ tự (dễ sử dụng hơn mật khẩu đơn giản).

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.