Bisakah Anda mengatur kata sandi di .ssh / config untuk mengizinkan login otomatis?


93

Saya menggunakan Ubuntu 11.10. Saya menggunakan sshuntuk menghubungkan ke banyak server setiap hari, jadi saya menaruh parameter mereka dalam .ssh/configfile seperti ini:

Host Home
User netmoon
Port 22
HostName test.com

Adakah cara untuk memasukkan kata sandi untuk setiap koneksi dalam file ini, sehingga, ketika server meminta kata sandi, terminal memasukkan kata sandinya dan mengirimkannya ke server?

Saya memerlukan ini karena kadang-kadang saya berdiri jauh dari PC dan ketika saya kembali, ketikkan kata sandi dan tekan Enterterminal bertuliskan CONNECTION CLOSED.

PS Saya tidak ingin menggunakan pasangan kunci publik / pribadi.


1
Saya berada dalam situasi yang sama dan saya tidak dapat mengunggah kunci publik saya karena saya memiliki akses ssh hanya untuk svn. Itu adalah jika saya mencoba ssh svnhost saya mendapatkan "(sukses (2 2 () (sunting-pipa svndiff1 absen-entri komit-revprops kedalaman log-revprops parsial-replay)))" svnserve respons dan bukan shell
Uberto

Lihat unix.stackexchange.com/a/83991/26493 dan andre.frimberger.de/index.php/linux/… untuk cara dengan memanfaatkan SSH_ASKPASS.
Olaf Dietsche

Jawaban:


56

Menukar keamanan untuk kenyamanan tidak pernah berakhir dengan baik ...

Bisakah Anda menggunakan ssh-copy-iddari openssh-clientpaket?

Dari man ssh-copy-id:

ssh-copy-id adalah skrip yang menggunakan ssh untuk masuk ke mesin jarak jauh dan menambahkan file identitas yang ditunjukkan ke file ~ / .ssh / berwenang_keys mesin itu.


12
Ini tidak berfungsi jika admin jarak jauh bersikeras menonaktifkan otorisasi kunci publik ...
tomasz

2
Ya, tetapi bersikap realistis pada sistem di bawah seluruh pengawasan dan kontrol langsung Anda tidak membuat kompromi. Katakanlah, misalnya, pada mesin virtual gelandangan tanpa koneksi luar yang digunakan hanya untuk tujuan pengembangan pada satu kursi.
Scott

36
Bersikeras keamanan yang kejam tanpa sebab juga tidak pernah berakhir dengan baik.
cwallenpoole

6
Terkadang itu berakhir dengan baik.
devth

3
IMHO, desakan kata sandi untuk otentikasi lebih berisiko daripada tidak. Saya seringkali mengatur kata sandi yang sering digunakan untuk ssh sebagai variabel lingkungan karena saya enggan mengingat serangkaian string acak. Dengan menuntut pengguna memasukkan mereka hanya meminta mereka untuk disimpan dengan buruk.
Eggmatters

26

Jika Anda tidak benar-benar ingin menggunakan pasangan kunci publik / pribadi, Anda dapat menulis expectskrip untuk memasukkan kata sandi untuk Anda secara otomatis tergantung pada alamat tujuan.

Sunting: Maksud saya adalah Anda dapat memiliki skrip yang, di satu sisi, gunakan expectuntuk memasukkan kata sandi untuk Anda dan, di sisi lain, membaca kata sandi untuk pengguna yang diberikan dan host dari file konfigurasi. Misalnya, skrip python berikut akan berfungsi untuk skenario hari yang cerah:

#!/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)

dan format file konfigurasi adalah sebagai berikut:

[user_1]
host1 = passwd_1
host2 = passwd_2

[user_2]
host1 = passwd_1
host2 = passwd_2

Catatan: Seperti yang dijelaskan, skrip python perlu menjadi jauh lebih kompleks untuk menangani semua kemungkinan kesalahan dan pesan pertanyaan dari ssh dan semua URL yang mungkin (dalam contoh diasumsikan bahwa itu akan menjadi sesuatu seperti user@host, tetapi bagian pengguna tidak t digunakan sebagian besar kali), tetapi ide dasarnya akan tetap sama. Mengenai file konfigurasi, Anda dapat menggunakan file konfigurasi yang berbeda atau menggunakan .ssh/configdan menulis kode Anda sendiri untuk mengurai file itu dan mendapatkan kata sandi untuk pengguna dan host yang diberikan.


dapatkah Anda menjelaskan lebih lanjut?
Netmoon

@ Netmoon Saya menambahkan contoh kecil ke jawaban saya untuk saya itu lebih jelas.
jcollado

Ini tidak menjawab pertanyaan tentang bagaimana memasukkan kata sandi dalam file .ssh / config
Eric Woodruff

1
Memang, itu tidak menjawab pertanyaan itu. Tapi itu memecahkan masalah: hindari mengetik kata sandi secara manual dan menyimpannya dalam file. Itulah yang dibutuhkan OP.
Arcesilas

19

Ada juga sshpassprogram untuk itu. Cara Penggunaan: sshpass -p MyPa55word ssh me@myservor.com


29
Kecuali Anda mengawali perintah dengan spasi, ( sshpassalih-alih sshpass), Anda baru saja menyimpan kata sandi Anda ("MyPa55word") di file histori shell Anda.
waltinator

1
@waltinator poin bagus
igor

3
Ya, si penanya juga baik-baik saja .ssh/config, mengapa tidak ada dalam sejarah shell juga?
Darth Egregious

Ini tidak secara resmi di Homebrew tetapi Anda dapat menginstal dari repo pihak ketiga dengan brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb. Lebih lanjut: gist.github.com/arunoda/7790979
Jacob Ford

read -s password; sshpass -p "$password" ssh me@myservor.com. Ini akan mencegah kata sandi ditampilkan dalam sejarah
Alexander Bird

19

Bagaimana dengan ProxyCommand:

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

Anda dapat menggunakan ssh -Wbukan ncjuga:

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

Ini tidak akan berfungsi seperti yang diharapkan dengan -Wopsi. Apakah Anda punya solusinya?
Toan Nguyen

2
Ia masih menanyakan kata sandi dengan perintah proxy ini ...
Victor Piousbox

1
Saya juga merasa masih meminta kata sandi. Semua ini tampaknya dilakukan adalah memindahkan masalah dari test.commeminta kata sandi ke Homekata sandi. Apa gunanya? Apa trik untuk membuatnya bekerja?
Martin Bramwell

15

Tidak. Ini tidak mungkin, saya khawatir.

Satu-satunya alternatif nyata adalah dengan menggunakan kunci pribadi tetapi Anda telah mengatakan Anda tidak ingin (mengapa tidak?).


7
karena saya tidak punya izin untuk meletakkan kunci lain di server.
Netmoon

2
@ Netmoon: Jika Anda bisa masuk, Anda bisa menambahkan kunci, bukan? Anda hanya perlu akses tulis ke direktori home Anda, kecuali sysadmin mengatur semuanya dengan aneh.
Scott Severance

4
@ScottSeverance Saya pikir itulah situasi yang dirujuk pertanyaan ini. Tidak memiliki kemampuan untuk menambahkan kunci. Ya itu aneh, tetapi sering terjadi.
user239558

5
Saya sudah memiliki pengalaman yang sangat umum dari lingkungan hosting bersama di mana akses kunci publik dinonaktifkan, jadi meskipun Anda dapat menambahkan kunci, mereka tidak digunakan. itu bertentangan dengan alasan ya, tapi itulah cara banyak penyedia hosting mengatur server mereka
billynoah

1
Ada jawaban yang menunjukkan itu mungkin
Eric Woodruff

8

Anda dapat membuat penggantian skrip ssh sederhana di / 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

Dan kemudian dalam file ~ / .ssh / config Anda dapat Anda gunakan

Host foohost
    User baruser
    #Password foobarpassword

4

Saya menggunakan aplikasi dari VanDyke Software bernama SecureCRT .

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

Ini tidak gratis, tetapi sangat terjangkau. Saya telah menggunakannya selama bertahun-tahun (berjalan pada Windows, atau menggunakan Wine) untuk akses jarak jauh, emulasi terminal, dan (tersebar) manajemen jaringan. Mereka akhirnya merilis versi Linux asli ini pada awal 2011.

Ini memiliki dukungan untuk pengaturan login yang kompleks (atau skrip), kata sandi yang tersimpan (atau sertifikat), tab beberapa sesi, dll.

Saat startup Anda dapat memilih target jarak jauh (dan protokol) mana dari daftar terstruktur (tampilan hierarki) dari mesin jarak jauh yang disimpan (atau lokal), atau cukup buat koneksi (yang kemudian disimpan).

Saya telah menemukannya sangat berguna untuk situs remote dengan otentikasi tingkat lanjut, port non-standar, atau negosiasi akses firewall.

Jika Anda sering melakukan akses jarak jauh (bagian dari peran utama Anda), maka aplikasi ini akan membenarkan biayanya pada bulan pertama penggunaan.


maaf saya tidak mengerti. dapatkah kamu menjelaskan
Netmoon

1
reworded for you ..
david6

2
Sejak memposting respons di atas, ada beberapa iterasi SecureCRT, termasuk yang terbaru VanDyke baru dirilis pada awal Desember 2013. Setiap iterasi telah meningkatkan program sehingga membuatnya lebih fleksibel. Ini juga memiliki API yang kaya yang memungkinkan program untuk dikontrol / dihubungkan dengan skrip Python / VB. SecureCRT telah menjadi bagian dari perangkat inti saya selama satu dekade yang baik, dan saya sangat merekomendasikannya.
Ville

Sepakat. Saya terus menguji beta setiap rilis baru, dan sangat terlibat dalam pengujian awal untuk porting ke Ubuntu .
david6

2

Menjawab pertanyaan yang Anda ajukan, tidak, tidak mungkin mengonfigurasi kata sandi default di file konfigurasi ssh.

Tetapi jika memang, seperti yang Anda katakan, itu "karena kadang-kadang saya berdiri jauh dari PC dan ketika saya kembali, ketikkan kata sandi dan tekan Enterterminal yang mengatakan CONNECTION CLOSED" , lalu mengapa tidak mencegah menutup sesi saja? SSH dapat menjaga koneksi tetap hidup untuk Anda.

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

1

Terima kasih, Arek untuk inspirasinya ...

Alih-alih menjalankan proses shell lain, ini hanya fungsi yang berjalan di bash shell saat ini. Ini menjalankan awkperintah tunggal untuk mem-parsing file config dan mencari tahu apakah itu harus mengambil kata sandi dari variabel shell atau dari kata sandi yang ditulis cleartext ke dalam file konfigurasi ssh (dengan alih awk- evalalih describekarena masalah yang saya tekan menggunakan describe).

Saya mencoba banyak cara untuk menggunakan sshpasslangsung dalam sshfile konfigurasi menggunakan ProxyCommand, tetapi tidak ada yang berfungsi seperti yang diharapkan, kecuali ketika saya bisa masuk ke kotak melalui RSA. Tetapi kemudian saya perlu mengirim kata sandi untuk membuka direktori terenkripsi saya. Namun, fungsi saya di bawah ini tampaknya bekerja untuk saya dalam semua kasus, bahkan untuk 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)

Maka ~/.ssh/configbagian yang terlihat seperti ini:

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

Jika #Passvar ada di bagian konfigurasi ini menimpa #Password.
$MYPASS_ENVVARadalah variabel lingkungan yang menyimpan kata sandi Anda.

Nikmati!


1

Jawaban @BrunoPereira untuk pertanyaan ini menunjukkan metode alternatif untuk terhubung tanpa secara eksplisit memasukkan kata sandi dan menghindari kunci ssh.

Anda bisa membuat skrip, alias atau fungsi di Anda ~/.bashrcuntuk dengan cepat menjalankan perintah itu.

Jelas, ada pertimbangan keamanan yang harus Anda perhitungkan dengan pendekatan ini.


Sangat bagus bahwa Anda menautkan ke solusi - namun, itu juga praktik yang baik untuk melanjutkan dan memposting solusi di sini. Dengan begitu, jika tautannya pernah dihapus (seperti yang terjadi pada pertukaran tumpukan sesekali) masih ada jawaban yang dapat digunakan di sini.
Paul

0

Berikut variasi rumit saya pada jawaban @ ArekBurdach. Ini menawarkan ekstensi berikut:

  • yang tuan rumah bisa di mana saja di sshbaris perintah; yaitu juga mendukung ssh <args> <host> <commands>sintaks
  • tidak menyulitkan kode path ke ssh
  • parsing lebih kuat dari ssh_config
  • Bonus: bungkus untuk scpjuga

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

Instalasi

Tetapkan alias di ~/.bashrc:

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

Konfigurasi

Dengan IgnoreUnknownarahan, sshtidak mengeluh tentang Passwordarahan yang baru diperkenalkan , jadi (berbeda dengan jawaban @ ArekBurdach), kita dapat menjadikan ini tampak sebagai konfigurasi "nyata". Jika Anda tidak suka ini, itu sepele untuk mengubah skrip kembali ke yang berkomentar.

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

Host foohost
    User baruser
    Password foobarpassword

0

Jika Anda tidak memiliki akses langsung ke pasangan kunci, Anda bisa mengenkripsi kata sandi di mesin lokal Anda.

Cara untuk melakukannya adalah mengenkripsi kata sandi Anda menggunakan kunci selain dari ProxyCommand @ Wood Wood.

Cara untuk menggabungkan menggunakan pipa:

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

dimana

Host real-destination
    Hostname test.com
    User netmoon

0

Ada sedikit variasi cara yang dijelaskan di blog tentang cara menggunakan sshpass yang dapat ditemukan di sini . Mengingat Anda memiliki kata sandi terenkripsi gpg (bagaimana hal ini dijelaskan dalam blog) Anda bisa melakukan sesuatu seperti ini:

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

dan cukup simpan perintah itu sebagai alias di blog Anda .bashrc.

Jika Anda ingin menggali melalui koneksi itu Anda bisa melakukan sesuatu seperti

 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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.