Otomatik oturum açmaya izin vermek için şifreleri .ssh / config içinde ayarlayabilir misiniz?


93

Ubuntu 11.10 kullanıyorum. sshGünlük birçok sunucuya bağlanmak için kullanıyorum , bu yüzden parametrelerini şu şekilde .ssh/configdosyaya koydum :

Host Home
User netmoon
Port 22
HostName test.com

Bu dosyadaki her bağlantı için parola koymanın bir yolu var mı, böylece sunucu parolayı istediğinde, terminal parolasını girip sunucuya gönderir mi?

Buna ihtiyacım var, çünkü bazen bilgisayardan uzak duruyorum ve geri döndüğümde, bir şifre Enteryazıp terminalin basın diyor CONNECTION CLOSED.

PS Herkese açık / özel bir anahtar çifti kullanmak istemiyorum.


1
Aynı durumdayım ve ortak anahtarımı yükleyemiyorum çünkü yalnızca svn için ssh erişimim var. Yani ssh svnhost denersem "(başarı (2 2 () (edit-pipeline svndiff1 eksik girişleri taahhüt-revprops derinlik log-revprops kısmi tekrar)))" "svnserve cevabı değil
Uberto

Yanıtlar:


56

Güvenliğiniz için kolaylık sağlamak için işlem yapmak asla iyi olmaz ...

Kullanmak Could ssh-copy-idgelen openssh-clientpaketin?

Kimden man ssh-copy-id:

ssh-copy-id, uzak bir makineye giriş yapmak ve belirtilen kimlik dosyasını bu makinenin ~ / .ssh / yetkili_keys dosyasına eklemek için ssh kullanan bir betiktir.


12
Uzaktan yönetim, genel anahtar yetkilendirmesini devre dışı bırakmak konusunda ısrar ederse, bu işe yaramaz ...
tomasz

2
Evet, ancak tüm doğrudan denetiminiz ve kontrolünüz altındaki sistemler üzerinde gerçekçi olmak bir uzlaşma sağlamaz. Örneğin, yalnızca geliştirme amacıyla tek bir koltukta kullanılan dış bağlantı olmayan serseri bir sanal makinede.
Scott,

36
Sebepsiz Draconian güvenliği konusunda ısrar etmek de asla iyi bitmez.
cwallenpoole

6
Bazen iyi biter.
saat

3
IMHO, kimlik doğrulama için şifre ısrarı olmamasından daha risklidir. Genellikle, bir dizi keyfi dizgiyi hatırlamaktan kaçındığım için, çevre değişkenleri olarak ssh için sıklıkla kullanılan şifreleri kullandım. Talep eden kullanıcılar girdiğinde onlara basitçe kötü saklanmaları isteniyor.
yumurta matları

26

Genel / özel bir anahtar çifti kullanmak istemiyorsanız expect, hedef adresinize bağlı olarak otomatik olarak şifrenizi girmek için bir komut dosyası yazabilirsiniz .

Düzenleme: Demek istediğim, bir yandan, expectsizin için şifreyi girmek için kullanan ve diğer yandan, belirli bir kullanıcı ve ana bilgisayar için bir yapılandırma dosyasından şifreyi okuyan bir betik olabilir . Örneğin, aşağıdaki python betiği güneşli gün senaryosu için çalışacaktır:

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

ve yapılandırma dosyası formatı aşağıdaki gibi olacaktır:

[user_1]
host1 = passwd_1
host2 = passwd_2

[user_2]
host1 = passwd_1
host2 = passwd_2

Not: Açıklandığı gibi, python betiğinin tüm olası hataları işlemek ve ssh ile olası tüm URL'leri sorgulamak için çok daha karmaşık olması gerekir (örnekte, bunun gibi bir şey olacağı varsayılır user@host, ancak kullanıcı kısmı böyle olmaz) çoğu zaman kullanılmadı), fakat temel fikir hala aynı olurdu. Yapılandırma dosyasıyla ilgili olarak, farklı bir yapılandırma dosyası kullanabilir veya .ssh/configbu dosyayı ayrıştırıp belirli bir kullanıcı ve ana bilgisayar için şifreyi almak için kendi kodunuzu yazıp kullanabilirsiniz .


daha fazla açıklayabilir misin?
Netmoon

@ Netmoon Daha net bir şekilde cevabımın küçük bir örneğini ekledim.
jcollado

Bu, şifreyi .ssh / config dosyasına nasıl koyacağımız sorusuna cevap vermez
Eric Woodruff

1
Aslında, bu soruyu cevaplamıyor. Ancak sorunu çözer: şifreleri manuel olarak yazmaktan ve bir dosyada saklamaktan kaçının. OP'nin gerektirdiği şey oldukça güzel.
Arcesilas,

19

Bunun sshpassiçin de bir program var. Nasıl kullanılır: sshpass -p MyPa55word ssh me@myservor.com


29
Komutunuzu bir boşlukla belirtmezseniz ( sshpassyerine sshpass), şifrenizi ("MyPa55word") kabuğunuzun geçmiş dosyasında sakladınız.
waltinator

1
@waltinator iyi nokta
igor

3
Peki, soru soranın içinde olduğu konusunda sorun yoktu .ssh/config, neden kabuk tarihinde değil?
Darth Egregious

Resmi olarak Homebrew'te değil, ancak bir üçüncü taraf deposundan yükleyebilirsiniz brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb. Daha fazla: gist.github.com/arunoda/7790979
Jacob Ford

read -s password; sshpass -p "$password" ssh me@myservor.com. Bu parolanın tarihe geçmesini önleyecektir
Alexander Bird

19

ProxyCommand'a ne dersiniz:

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

Bunun ssh -Wyerine de kullanabilirsiniz nc:

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

-WSeçeneği ile beklendiği gibi çalışmayacak . Herhangi bir geçici çözümünüz var mı?
Toan Nguyen,

2
Hala bu proxy komutuyla şifrenizi soruyor ...
Victor Piousbox

1
Ayrıca hala bir şifre soruyor buluyorum. Tüm bunlar göründüğü gibi, problemi test.combir şifre Homeistemek, bir şifre istemek haline getirmek. Amaç ne? Çalışması için püf noktası nedir?
Martin Bramwell

15

Hayır. Bu mümkün değil korkuyorum.

Tek gerçek alternatif özel anahtarları kullanmaktır ancak istemediğinizi söylediniz (neden olmasın?).


7
çünkü sunucuya başka bir anahtar koymak için iznim yok.
Netmoon

2
@ Netmoon: Giriş yapabilirseniz, bir anahtar ekleyebilirsiniz, değil mi? Eğer sistem yöneticisi garip bir şekilde ayarlamadıysa, sadece ana dizininize yazma erişimine ihtiyacınız var.
Scott Severance

4
@ScottSeverance Bu sorunun ifade ettiği durum budur. Anahtar ekleyememek. Evet garip ama çoğu zaman oluyor.
user239558 16:13

5
Genel anahtar erişiminin devre dışı bırakıldığı paylaşılan barındırma ortamları konusunda çok genel bir deneyim yaşadım, bu nedenle anahtar ekleyebilseniz de kullanılmıyor. evet, nedenine aykırıdır, ancak birçok barındırma sağlayıcısının sunucularını kurma
şekli budur

1
Bunun mümkün olduğunu gösteren cevaplar var
Eric Woodruff

8

/ Usr / local / bin dizininde basit bir ssh betiği yedeği oluşturabilirsiniz:

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

Ve sonra ~ / .ssh / config dosyanızda kullanabilirsiniz

Host foohost
    User baruser
    #Password foobarpassword

4

VanCRy Yazılımından SecureCRT adlı bir uygulamayı kullanıyorum .

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

Ücretsiz değil, ama çok uygun fiyatlı. Uzaktan erişim, terminal emülasyonu ve (dağınık) ağ yönetimi için yıllarca (Windows'ta çalışan veya Wine kullanarak) kullandım. Sonunda 2011'in başında bunun Linux sürümünü yayımladılar.

Karmaşık giriş ayarları (veya komut dosyaları), saklanan şifreler (veya sertifikalar), sekmeli çoklu oturumlar vb. Desteği vardır.

Başlangıçta, depolanan uzak (veya yerel) makinelerin yapılandırılmış listesinden (ağaç görünümünden) hangi uzak hedefi (ve protokolü) seçebilir veya yalnızca (daha sonra depolanan) bir bağlantı oluşturabilirsiniz.

Gelişmiş kimlik doğrulaması, standart olmayan bağlantı noktaları veya güvenlik duvarı erişimi anlaşması olan uzak siteler için özellikle yararlı buldum.

Uzaktan erişim çok yapıyorsanız (ana rolünüzün bir parçası), bu uygulama ilk kullanım ayında giderinizi haklı çıkarır.


üzgünüm anlamıyorum açıklayabilir misin ?
Netmoon

1
senin için
reworded

2
Yukarıdaki cevabın yayınlanmasından bu yana, Aralık 2013’ün başlarında piyasaya sürülen en son VanDyke’nin de dahil olduğu SecureCRT’nin birkaç yinelemesi vardı. Ayrıca programın Python / VB scriptleri ile kontrol edilmesini / arayüzlenmesini sağlayan zengin bir API'ye sahiptir. SecureCRT iyi bir on yıl boyunca çekirdek araç setimin bir parçası oldu ve kesinlikle tavsiye ediyorum.
Ville

Kabul. Her yeni sürümde beta testi yapmaya devam ettim ve Ubuntu'ya taşınması için erken testlerde yoğun şekilde yer aldım .
david6

2

İstediğiniz soruyu cevaplayarak, bir ssh config dosyasında varsayılan bir şifreyi yapılandırmak mümkün değildir.

Ama gerçekten dediğiniz gibi, "bazen PC'den uzak durduğumda ve geri döndüğümde, bir şifre yazın ve Enterterminale basın CONNECTION CLOSED" , öyleyse neden oturumu kapatmayı engellemiyorsunuz? SSH, bağlantıları sizin için canlı tutabilir.

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

1

Teşekkürler, ilham için Arek ...

Başka bir kabuk işlemi çalıştırmak yerine, bu sadece geçerli bash kabuğunda çalışan bir işlevdir. Tek bir çalışan awko (bir kabuk değişkeni veya SSH yapılandırma dosyasına şifre yazılı düz yazı şifreyi almalı eğer yapılandırma dosyası ayrıştırmak ve anlamaya komutu awkbir in evalyerine describekullanıyorum isabet sorunları nedeniyle describe).

ProxyCommand kullanarak sshpassdoğrudan bir sshconfig dosyasında kullanmanın pek çok yolunu denedim , ancak hiçbir şey RSA üzerinden bir kutuya giriş yapmam dışında beklendiği gibi çalışıyor gibiydi. Ama şifreli dizini açmak için bir şifre göndermem gerekiyordu. Bununla birlikte, aşağıdaki fonksiyonum her durumda Cygwin için bile benim için çalışıyor gibi görünüyor.

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

Sonra bir ~/.ssh/configbölüm şöyle görünür:

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

Bir ederse #Passvar yapılandırma bölümünde bulunmaktadır bu geçersiz kılar #Password.
$MYPASS_ENVVARşifrenizi tutan ortam değişkenidir.

Keyfini çıkarın!


1

@BrunoPereira'nın bu soruya verdiği cevap açıkça bir şifre girmeden ve ssh anahtarlarından kaçınmadan bağlantı kurmanın alternatif bir yöntemini gösteriyor.

Bu ~/.bashrckomutu hızlı bir şekilde yerine getirmek için bir komut dosyası, bir takma ad veya bir işlev oluşturabilirsiniz.

Açıkçası, bu yaklaşımla göz önünde bulundurmanız gereken güvenlik hususları var.


Bir çözüme bağlanmanız harika - ancak, devam etmek ve çözümü burada göndermek de iyi bir uygulamadır. Bu şekilde, eğer bağlantı hiç kaldırılmazsa (bazen yığın borsasında olduğu gibi) burada hala kullanılabilir bir cevap var.
Paul

0

İşte @ ArekBurdach'ın cevabındaki ayrıntılı varyasyonum. Aşağıdaki uzantıları sunar:

  • konak içinde herhangi bir yerde olabilir sshkomut satırı; yani, ssh <args> <host> <commands>sözdizimini de destekliyor
  • yolunu zor kodlamıyor ssh
  • daha güçlü ayrıştırma ssh_config
  • Ek: için sargı scp, çok

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

Kurulum

Takma adınızı tanımlayın ~/.bashrc:

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

Yapılandırma

İle IgnoreUnknowndirektif, sshyeni tanıtılan şikayet etmez Passworddirektifi, bu yüzden (@ ArekBurdach cevabı aksine), bu "gerçek" bir yapılandırma olarak görünmesini sağlayabilirsiniz. Bunu beğenmediyseniz, komut dosyasını yorumlanana geri döndürmek çok önemlidir.

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

Host foohost
    User baruser
    Password foobarpassword

0

Anahtar çiftine doğrudan erişiminiz yoksa, yerel makinenizdeki şifreyi şifreleyebilirsiniz.

Bunu yapmanın yolu, @Eric Woodruff'un ProxyCommand komutuna ek olarak , şifrenizi kullanarak şifrenizi şifrelemek .

Birleştirmenin bir yolu boru kullanıyor:

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

nerede

Host real-destination
    Hostname test.com
    User netmoon

0

Nasıl kullanılacağı hakkında blogunda açıklanan şekilde hafif bir varyantı vardır sshpass bulunabilir burada . Bir gpg şifreli şifreniz olduğundan (bunu blogda nasıl tanımlanır) dosyaya şöyle bir şey yapabilirsiniz:

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

ve sadece bu komutu sizin adınıza bir takma ad olarak kaydedin .bashrc.

Eğer bu bağlantıdan tünel açmak istersen, böyle bir şey yapabilirsin.

 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.