Bạn có thể đặt mật khẩu trong .ssh / config để cho phép đăng nhập tự động không?


93

Tôi đang sử dụng Ubuntu 11.10. Tôi đang sử dụng sshđể kết nối với nhiều máy chủ hàng ngày, vì vậy tôi đặt các tham số của chúng vào .ssh/configtệp như thế này:

Host Home
User netmoon
Port 22
HostName test.com

Có cách nào để đặt mật khẩu cho mỗi kết nối trong tệp này, để khi máy chủ yêu cầu mật khẩu, thiết bị đầu cuối sẽ nhập mật khẩu của nó và gửi nó đến máy chủ?

Tôi cần điều này bởi vì đôi khi tôi đứng cách xa PC và khi tôi quay lại, hãy nhập mật khẩu và nhấn Enterterminal nói CONNECTION CLOSED.

PS Tôi không muốn sử dụng cặp khóa công khai / riêng tư.


1
Tôi đang ở trong tình trạng tương tự và tôi không thể tải lên khóa công khai của mình vì tôi chỉ có quyền truy cập ssh cho svn. Đó là nếu tôi thử ssh svnhost tôi nhận được "(thành công (2 2 () (chỉnh sửa đường ống Svndiff1 vắng mặt các mục cam kết-revprops độ sâu log-revprops phát lại một phần)))" svnserve phản hồi và không phải là vỏ
Uber đến

Câu trả lời:


56

Giao dịch bảo mật để thuận tiện không bao giờ kết thúc tốt ...

Bạn có thể sử dụng ssh-copy-idtừ openssh-clientgói?

Từ man ssh-copy-id:

ssh-copy-id là một tập lệnh sử dụng ssh để đăng nhập vào một máy từ xa và nối thêm tệp nhận dạng được chỉ định vào tệp ~ / .ssh / ủy quyền của máy đó.


12
Điều này không hoạt động nếu quản trị viên từ xa khăng khăng vô hiệu hóa ủy quyền khóa công khai ...
tomasz

2
Có, nhưng thực tế trên các hệ thống dưới toàn bộ sự giám sát và kiểm soát trực tiếp của bạn sẽ không tạo ra sự thỏa hiệp. Ví dụ, giả sử trên một máy ảo mơ hồ không có kết nối bên ngoài chỉ được sử dụng cho mục đích phát triển trên một chỗ ngồi.
Scott

36
Nhấn mạnh vào an ninh hà khắc mà không có nguyên nhân cũng không bao giờ kết thúc tốt đẹp.
cwallenpoole

6
Đôi khi nó kết thúc tốt đẹp.
devth

3
IMHO, việc nhấn mạnh mật khẩu để xác thực có nhiều rủi ro hơn không. Tôi thường đặt mật khẩu cho ssh làm biến môi trường vì tôi không muốn nhớ một tập hợp các chuỗi tùy ý. Bằng cách yêu cầu người dùng nhập chúng chỉ đơn giản là yêu cầu chúng được lưu trữ kém.
đánh trứng

26

Nếu bạn không thực sự muốn sử dụng cặp khóa công khai / riêng tư, bạn có thể tự động viết một expecttập lệnh để nhập mật khẩu cho bạn tùy thuộc vào địa chỉ đích.

Chỉnh sửa: Ý tôi là bạn có thể có một tập lệnh, một mặt, sử dụng expectđể nhập mật khẩu cho bạn và mặt khác, đọc mật khẩu cho một người dùng và máy chủ lưu trữ từ một tệp cấu hình. Ví dụ: tập lệnh python sau đây sẽ hoạt động cho kịch bản ngày nắng:

#!/usr/bin/python                                                                                                                        
import argparse
from ConfigParser import ConfigParser
import pexpect

def main(args):
    url = args.url
    user, host = url.split('@', 1)

    cfg_file = 'ssh.cfg'
    cfg = ConfigParser()
    cfg.read(cfg_file)
    passwd = cfg.get(user, host)

    child = pexpect.spawn('ssh {0}'.format(url))
    child.expect('password:')
    child.sendline(passwd)
    child.interact()

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Run ssh through pexpect')
    parser.add_argument('url')
    args = parser.parse_args()
    main(args)

và định dạng tệp cấu hình sẽ như sau:

[user_1]
host1 = passwd_1
host2 = passwd_2

[user_2]
host1 = passwd_1
host2 = passwd_2

Lưu ý: Như đã giải thích, tập lệnh python sẽ cần phức tạp hơn nhiều để xử lý tất cả các lỗi và thông báo câu hỏi có thể có từ ssh và tất cả các URL có thể (trong ví dụ, nó giả định rằng nó sẽ giống như vậy user@host, nhưng phần người dùng không phải là ' t sử dụng hầu hết thời gian), nhưng ý tưởng cơ bản vẫn sẽ giống nhau. Về tệp cấu hình, bạn có thể sử dụng một tệp cấu hình khác hoặc sử dụng .ssh/configvà viết mã của riêng bạn để phân tích tệp đó và lấy mật khẩu cho một người dùng và máy chủ lưu trữ cụ thể.


bạn có thể giải thích thêm?
Netmoon

@Netmoon Tôi đã thêm một ví dụ nhỏ vào câu trả lời của tôi cho nó rõ ràng hơn.
jcollado

Điều này không trả lời câu hỏi làm thế nào để đặt mật khẩu vào tệp .ssh / config
Eric Woodruff

1
Thật vậy, nó không trả lời câu hỏi đó. Nhưng nó giải quyết vấn đề: tránh phải nhập mật khẩu thủ công và lưu trữ chúng trong một tệp. Đó là những gì đẹp OP yêu cầu.
Arcesilas

19

Ngoài ra còn có sshpasschương trình cho điều đó. Cách sử dụng: sshpass -p MyPa55word ssh me@myservor.com


29
Trừ khi bạn mở đầu lệnh của bạn bằng một khoảng trắng , ( sshpassthay vì sshpass), bạn mới lưu trữ mật khẩu của mình ("MyPa55word") trong tệp lịch sử của shell.
hát rong

1
@waltinator điểm tốt
igor

3
Vâng, người hỏi đã ổn với nó .ssh/config, tại sao không trong lịch sử vỏ?
Darth Egregious

Nó không chính thức trên Homebrew nhưng bạn có thể cài đặt từ repo của bên thứ ba với brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb. Thêm: gist.github.com/arunoda/7790979
Jacob Ford

read -s password; sshpass -p "$password" ssh me@myservor.com. Điều này sẽ ngăn mật khẩu hiển thị trong lịch sử
Alexander Bird

19

Làm thế nào về ProxyCommand:

Host Home-raw
    HostName test.com
Host Home
   User netmoon
   Port 22
   ProxyCommand sshpass -pmypass ssh netmoon@%h-raw nc localhost %p

Bạn có thể sử dụng ssh -Wthay vì nclà tốt:

ProxyCommand sshpass -pmypass ssh netmoon@%h-raw -W localhost:%p

Nó sẽ không hoạt động như mong đợi với -Wtùy chọn. Bạn có cách giải quyết nào không?
Toàn Nguyễn

2
Nó vẫn hỏi tôi mật khẩu bằng lệnh proxy này ...
Victor Piousbox

1
Tôi cũng thấy nó vẫn hỏi mật khẩu. Tất cả điều này dường như làm là chuyển vấn đề từ test.comyêu cầu mật khẩu sang Homeyêu cầu mật khẩu. Vấn đề ở đây là gì? Bí quyết để làm cho nó hoạt động là gì?
Martin Bramwell

15

Không. Điều này là không thể. Tôi sợ.

Cách thay thế thực sự duy nhất là sử dụng khóa riêng nhưng bạn đã nói rằng bạn không muốn (tại sao không?).


7
bởi vì tôi không được phép đặt một khóa khác trên máy chủ.
Netmoon

2
@Netmoon: Nếu bạn có thể đăng nhập, bạn có thể thêm khóa, phải không? Bạn chỉ cần truy cập ghi vào thư mục chính của bạn, trừ khi sysadmin thiết lập mọi thứ một cách kỳ lạ.
Scott Severance

4
@ScottSeverance Tôi nghĩ đó là tình huống mà câu hỏi này đề cập đến. Không có khả năng thêm một khóa. Vâng, nó là lạ, nhưng nó thường xảy ra.
user239558

5
Tôi đã có trải nghiệm rất phổ biến về môi trường lưu trữ được chia sẻ nơi truy cập khóa công khai bị vô hiệu hóa, vì vậy mặc dù bạn có thể thêm khóa nhưng chúng không được sử dụng. nó đi ngược lại với lý do có, nhưng đó là cách nhiều nhà cung cấp dịch vụ lưu trữ thiết lập máy chủ của họ
billynoah

1
Có những câu trả lời cho thấy điều đó là có thể
Eric Woodruff

8

Bạn có thể tạo một thay thế tập lệnh ssh đơn giản trong / usr / local / bin:

#!/bin/bash

host=$1
password=`awk "/#Password/ && inhost { print \\\$2 } /Host/ { inhost=0 } /Host $host/ { inhost=1 }" ~/.ssh/config`

if [[ -z "$password" ]]; then
  /usr/bin/ssh $*
else
  sshpass -p $password /usr/bin/ssh $*
fi

Và sau đó trong tệp ~ / .ssh / config bạn có thể sử dụng

Host foohost
    User baruser
    #Password foobarpassword

4

Tôi sử dụng một ứng dụng từ VanDyke Software có tên SecureCRT .

http://www.vandyke.com/products/securecrt/

Nó không miễn phí, nhưng giá rất hợp lý. Tôi đã sử dụng nó trong nhiều năm (chạy trên Windows hoặc sử dụng Wine) để truy cập từ xa, mô phỏng thiết bị đầu cuối và quản lý mạng (phân tán). Cuối cùng họ đã phát hành phiên bản Linux gốc này vào đầu năm 2011.

Nó có hỗ trợ cho các cài đặt đăng nhập phức tạp (hoặc tập lệnh), mật khẩu được lưu trữ (hoặc chứng chỉ), được gắn thẻ nhiều phiên, v.v.

Khi khởi động, bạn có thể chọn mục tiêu từ xa (và giao thức) từ danh sách có cấu trúc (dạng xem cây) của các máy từ xa được lưu trữ (hoặc cục bộ) hoặc chỉ cần tạo kết nối (sau đó được lưu trữ).

Tôi đã tìm thấy nó đặc biệt hữu ích cho các trang web từ xa với xác thực nâng cao, cổng không chuẩn hoặc đàm phán truy cập tường lửa.

Nếu bạn đang thực hiện truy cập từ xa rất nhiều (một phần của vai trò chính của bạn), thì ứng dụng này sẽ chứng minh chi phí của nó trong tháng đầu tiên sử dụng.


xin lỗi, tôi không hiểu bạn có thể giải thích ?
Netmoon

1
sắp xếp lại cho bạn ..
david6

2
Kể từ khi đăng phản hồi trên, đã có một vài lần lặp lại của SecureCRT, bao gồm cả phiên bản mới nhất VanDyke vừa được phát hành vào đầu tháng 12 năm 2013. Mỗi lần lặp lại đã cải thiện chương trình khiến nó trở nên linh hoạt hơn. Nó cũng có một API phong phú cho phép chương trình được kiểm soát / giao tiếp với các tập lệnh Python / VB. SecureCRT đã là một phần của bộ công cụ cốt lõi của tôi trong một thập kỷ tốt và tôi đánh giá cao nó.
Ville

Đã đồng ý. Tôi tiếp tục thử nghiệm beta mỗi bản phát hành mới và đã tham gia rất nhiều vào thử nghiệm sớm để chuyển sang Ubuntu .
david6

2

Trả lời câu hỏi bạn đã hỏi, không thể cấu hình mật khẩu mặc định trong tệp cấu hình ssh.

Nhưng nếu thực sự, như bạn nói, đó là "bởi vì đôi khi tôi đứng cách xa PC và khi tôi quay lại, hãy nhập mật khẩu và nhấn Enterthiết bị đầu cuối nói CONNECTION CLOSED" , vậy thì tại sao không ngăn chặn việc đóng phiên? SSH có thể giữ kết nối sống cho bạn.

Host Home
  User netmoon
  Port 22
  HostName test.com
  ServerAliveInterval 300
  ServerAliveCountMax 2

1

Cảm ơn, Arek đã truyền cảm hứng ...

Thay vì chạy một tiến trình shell khác, đây chỉ là một chức năng chạy trong bash shell hiện tại. Nó chạy một đơn awklệnh để phân tích các tập tin cấu hình và tìm ra nếu nó nên lấy mật khẩu từ một biến vỏ hoặc từ dạng cleartext password ghi vào tập tin cấu hình ssh (với awkmột evalthay vì describedo các vấn đề tôi nhấn sử dụng describe).

Tôi đã thử rất nhiều cách sử dụng sshpasstrực tiếp trong sshtệp cấu hình bằng ProxyCommand, nhưng dường như không có gì hoạt động như mong đợi, ngoại trừ khi tôi có thể đăng nhập vào hộp qua RSA. Nhưng sau đó tôi cần gửi mật khẩu để mở thư mục được mã hóa của mình. Tuy nhiên, chức năng của tôi dưới đây dường như hoạt động với tôi trong mọi trường hợp, ngay cả đối với Cygwin.

# In your .bash_profile
function ssh(){
    host=$1;
    unset PASSWORD
    unset PASSVAR
    eval $(awk "/ *#[Pp]assvar / && inhost { printf \"PASSVAR=%s\",\$2; exit 1 } / *#[Pp]assword / && inhost { printf \"PASSWORD=%s\",\$2; } /^#?[Hh][oO][sS][tT] / && inhost { inhost=0; exit 1 } /^[Hh][oO][sS][tT] $host\$/ { inhost=1 }" ~/.ssh/config)
    if [[ -z "$PASSWORD" ]] && [[ -z "$PASSVAR" ]]; then
        /usr/bin/ssh -q $* 2>/dev/null
    else
       if [[ -n "$PASSVAR" ]]; then
          PASSWORD=$(TMP=${!PASSVAR-*};echo ${TMP##*-})
       fi
       /usr/local/bin/sshpass -p"$PASSWORD" /usr/bin/ssh -q $* 2>/dev/null
    fi
}
# and setup your passwords (perhaps in .bashrc instead...)
MYPASS_ENVVAR=SomePassword
MYPASSWD_FROM_FILE=$(</home/me/.passwd_in_file)

Sau đó, một ~/.ssh/configphần trông như thế này:

Host MyHostname
 Port 22
 Hostname 2.1.2.2
 User merrydan
 #Passvar MYPASS_ENVVAR
 #Password Some!Password

Nếu #Passvar tồn tại trong phần cấu hình, phần này sẽ ghi đè lên #Password.
$MYPASS_ENVVARlà biến môi trường giữ mật khẩu của bạn.

Thưởng thức!


1

Câu trả lời của @BrunoPereira cho câu hỏi này cho thấy một phương pháp thay thế để kết nối mà không cần nhập mật khẩu rõ ràng và tránh các khóa ssh.

Bạn có thể tạo một tập lệnh, bí danh hoặc hàm trong ~/.bashrcđể thực hiện nhanh lệnh đó.

Rõ ràng, có những cân nhắc về bảo mật mà bạn nên tính đến với phương pháp này.


Thật tuyệt khi bạn liên kết với một giải pháp - tuy nhiên, đó cũng là cách tốt để tiếp tục và đăng giải pháp tại đây. Bằng cách đó, nếu liên kết bị loại bỏ (đôi khi xảy ra trên trao đổi ngăn xếp), vẫn có một câu trả lời có thể sử dụng ở đây.
Paul

0

Đây là biến thể công phu của tôi về câu trả lời của @ ArekBurdach. Nó cung cấp các phần mở rộng sau:

  • các máy chủ có thể ở bất cứ đâu trong sshdòng lệnh; tức là nó cũng hỗ trợ ssh <args> <host> <commands>cú pháp
  • không khó mã hóa đường dẫn đến ssh
  • phân tích cú pháp mạnh mẽ hơn ssh_config
  • Phần thưởng: bao bọc cho scpquá

ssh-wrapper

#!/bin/bash

password=$(awk '
BEGIN {
    # Collect the SSH arguments as keys of a dictionary, so that we can easily
    # check for inclusion.
    for (i = 2; i < ARGC; i++) {
        sshArgs[ARGV[i]] = 1
    }

    # Only process the first argument; all others are the command-line arguments
    # given to ssh.
    ARGC = 2
}
$1 == "Password" && inhost { print $2 }
/^\s*Host\s/ {
    if ($2 in sshArgs)
        inhost=1
    else
        inhost=0
}
' ~/.ssh/config "$@")


if [ "$password" ]; then
    sshpass -p "$password" "$(which ssh)" "$@"
else
    "$(which ssh)" "$@"
fi

scp-wrapper

#!/bin/bash

password=$(awk '
BEGIN {
    # Collect the SCP arguments as keys of a dictionary, so that we can easily
    # check for inclusion.
    for (i = 2; i < ARGC; i++) {
        colonIdx = index(ARGV[i], ":")
        if (colonIdx > 0) {
            scpArgs[substr(ARGV[i], 1, colonIdx - 1)] = 1
        }
    }

    # Only process the first argument; all others are the command-line arguments
    # given to scp.
    ARGC = 2
}
$1 == "Password" && inhost { print $2 }
/^\s*Host\s/ {
    if ($2 in scpArgs)
        inhost=1
    else
        inhost=0
}
' ~/.ssh/config "$@")


if [ "$password" ]; then
    sshpass -p "$password" "$(which scp)" "$@"
else
    "$(which scp)" "$@"
fi

Cài đặt

Xác định bí danh trong ~/.bashrc:

alias ssh=ssh-wrapper
alias scp=scp-wrapper

Cấu hình

Với IgnoreUnknownchỉ thị, sshkhông phàn nàn về một lệnh mới được giới thiệu Password, vì vậy (ngược lại với câu trả lời của @ ArekBurdach), chúng ta có thể làm cho nó xuất hiện dưới dạng cấu hình "thực". Nếu bạn không thích điều này, việc thay đổi kịch bản trở lại thành bình luận là chuyện nhỏ.

# Allow specifying passwords for Host entries, to be parsed by ssh-wrapper.
IgnoreUnknown Password

Host foohost
    User baruser
    Password foobarpassword

0

Nếu bạn không có quyền truy cập trực tiếp vào cặp khóa, bạn có thể mã hóa mật khẩu trên máy cục bộ của mình.

Cách thực hiện là mã hóa mật khẩu của bạn bằng khóa cùng với ProxyCommand của @Eric Woodruff.

Một cách để kết hợp là sử dụng đường ống:

openssl rsautl -decrypt -inkey /path/to/decrypt_key -in /path/to/encrypted_password  | sshpass ssh real-destination -tt

Ở đâu

Host real-destination
    Hostname test.com
    User netmoon

0

Có một biến thể nhỏ của một cách được mô tả trong blog về cách sử dụng sshpass có thể được tìm thấy ở đây . Cho rằng bạn có mật khẩu được mã hóa gpg (cách thức này được mô tả trong blog), bạn có thể làm một cái gì đó như thế này:

 sshpass -p $(echo $(gpg -d -q .sshpasswd.gpg)) ssh your_desination.xyz

và chỉ cần lưu lệnh đó dưới dạng bí danh trong của bạn .bashrc.

Nếu bạn muốn tạo đường hầm thông qua kết nối đó, bạn có thể làm một cái gì đó như

 Host actual_dest
      Hostname actual.dest.xyz
      User username
      ProxyCommand sshpass -p $(echo $(gpg -d -q ~/.sshpasswd.gpg)) \ 
                   ssh your_destination.xyz nc %h %p
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.