Czy możesz ustawić hasła w .ssh / config, aby umożliwić automatyczne logowanie?


93

Używam Ubuntu 11.10. Używam sshdo łączenia się z wieloma serwerami codziennie, więc umieszczam ich parametry w .ssh/configpliku w następujący sposób:

Host Home
User netmoon
Port 22
HostName test.com

Czy istnieje sposób na umieszczenie haseł dla każdego połączenia w tym pliku, aby gdy serwer poprosił o hasło, terminal wprowadził swoje hasło i wysłał je na serwer?

Potrzebuję tego, ponieważ czasami odstaję od komputera, a kiedy wracam, wpisz hasło i naciśnij Enterterminal mówi CONNECTION CLOSED.

PS Nie chcę używać pary kluczy publiczny / prywatny.


1
Jestem w tej samej sytuacji i nie mogę załadować mojego klucza publicznego, ponieważ mam dostęp do ssh tylko dla svn. To znaczy, jeśli spróbuję ssh svnhost otrzymuję "(sukces (2 2 () (edit-pipeline svndiff1 nieobecne wpisy commit-revprops głębokość log-revprops częściowe odtworzenie)))" svnserve odpowiedź, a nie powłoka
Uberto

Zobacz unix.stackexchange.com/a/83991/26493 i andre.frimberger.de/index.php/linux/…, aby znaleźć sposób wykorzystania SSH_ASKPASS.
Olaf Dietsche

Odpowiedzi:


56

Zamiana bezpieczeństwa dla wygody nigdy się nie kończy dobrze ...

Czy możesz użyć ssh-copy-idz openssh-clientpaczki?

Od man ssh-copy-id:

ssh-copy-id to skrypt, który używa ssh do zalogowania się na zdalnym komputerze i dołączenia wskazanego pliku tożsamości do pliku ~ / .ssh / Author_keys tego komputera.


12
To nie działa, jeśli zdalny administrator nalega na wyłączenie autoryzacji klucza publicznego ...
tomasz

2
Tak, ale bycie realistycznym w systemach pod całym twoim bezpośrednim nadzorem i kontrolą nie stanowi kompromisu. Powiedzmy, na przykład, na wirtualnej maszynie wirtualnej bez żadnych zewnętrznych połączeń używanych wyłącznie do celów programistycznych na jednym stanowisku.
Scott

36
Naleganie na drakońskie bezpieczeństwo bez przyczyny również nigdy nie kończy się dobrze.
cwallenpoole

6
Czasami kończy się dobrze.
devth

3
IMHO, naleganie na hasła do uwierzytelnienia jest bardziej ryzykowne niż nie. Często ustawiałem często używane hasła do ssh jako zmienne środowiskowe, bo nie chcę pamiętać zestawu dowolnych ciągów. Wymagając od użytkowników wpisania ich, po prostu prosi ich o złe przechowywanie.
eggmatters

26

Jeśli tak naprawdę nie chcesz używać pary kluczy publiczny / prywatny, możesz napisać expectskrypt, który automatycznie wprowadzi hasło w zależności od adresu docelowego.

Edycja: Mam na myśli to, że możesz mieć skrypt, który z jednej strony używa expecthasła do ciebie, az drugiej strony odczytuje hasło dla danego użytkownika i hosta z pliku konfiguracyjnego. Na przykład następujący skrypt w języku Python będzie działał w scenariuszu ze słonecznym dniem:

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

a format pliku konfiguracyjnego byłby następujący:

[user_1]
host1 = passwd_1
host2 = passwd_2

[user_2]
host1 = passwd_1
host2 = passwd_2

Uwaga: Jak wyjaśniono, skrypt w języku Python musiałby być znacznie bardziej skomplikowany, aby obsłużyć wszystkie możliwe błędy i komunikaty pytań z ssh i wszystkich możliwych adresów URL (w przykładzie założono, że będzie to coś podobnego user@host, ale część użytkownika nie jest używane przez większość czasu), ale podstawowa idea pozostanie taka sama. Jeśli chodzi o plik konfiguracyjny, możesz użyć innego pliku konfiguracyjnego lub użyć .ssh/configi napisać własny kod, aby przeanalizować ten plik i uzyskać hasło dla danego użytkownika i hosta.


czy możesz wyjaśnić dalej?
Netmoon,

@Netmoon Dodałem mały przykład do mojej odpowiedzi, aby było jaśniej.
jcollado

To nie odpowiada na pytanie, jak umieścić hasło w pliku .ssh / config
Eric Woodruff

1
Rzeczywiście, nie odpowiada na to pytanie. Ale to rozwiązuje problem: unikaj konieczności ręcznego wpisywania haseł i przechowywania ich w pliku. Co jest dość potrzebne OP.
Arcesilas

19

Istnieje również sshpassprogram do tego. Jak używać: sshpass -p MyPa55word ssh me@myservor.com


29
O ile nie poprzedzisz polecenia spacją ( sshpasszamiast sshpass), właśnie zapisałeś hasło („MyPa55word”) w pliku historii powłoki.
waltinator

1
@waltinator dobry punkt
Igor

3
Pytający zadawał sobie pytanie .ssh/config, dlaczego nie w historii muszli?
Darth Egregious

To nie jest oficjalnie na Homebrew, ale możesz zainstalować z repozytorium innej firmy za pomocą brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb. Więcej: gist.github.com/arunoda/7790979
Jacob Ford

read -s password; sshpass -p "$password" ssh me@myservor.com. Zapobiegnie to wyświetlaniu hasła w historii
Alexander Bird

19

Co z ProxyCommand:

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

Możesz użyć ssh -Wzamiast nc:

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

Nie będzie działać zgodnie z oczekiwaniami z -Wopcją. Czy masz jakieś obejście?
Toan Nguyen,

2
Nadal pyta mnie o hasło do tego polecenia proxy ...
Victor Piousbox

1
Uważam również, że nadal prosi o hasło. Wydaje się, że wszystko to polega na przeniesieniu problemu z test.comwymagania hasła na Homewymaganie hasła. Jaki jest sens? Jaka jest sztuczka, aby to zadziałało?
Martin Bramwell

15

Nie. Obawiam się, że to niemożliwe.

Jedyną prawdziwą alternatywą jest używanie kluczy prywatnych, ale powiedziałeś, że nie chcesz (dlaczego nie?).


7
ponieważ nie mam uprawnień do umieszczenia innego klucza na serwerze.
Netmoon,

2
@Netmoon: Jeśli możesz się zalogować, możesz dodać klucz, prawda? Potrzebujesz tylko dostępu do zapisu do swojego katalogu domowego, chyba że sysadmin dziwnie to skonfigurował.
Scott Severance,

4
@ ScottSeverance Myślę, że jest to sytuacja, do której odnosi się to pytanie. Brak możliwości dodania klucza. Tak, to dziwne, ale często się zdarza.
user239558

5
Mam bardzo powszechne doświadczenia ze współdzielonymi środowiskami hostingowymi, w których dostęp do klucza publicznego jest wyłączony, więc nawet jeśli możesz dodawać klucze, nie są one używane. jest to sprzeczne z rozumem tak, ale w taki sposób wielu dostawców hostingu konfiguruje swoje serwery
billynoah

1
Istnieją odpowiedzi, które pokazują, że jest to możliwe
Eric Woodruff

8

Możesz utworzyć prostą zamianę skryptu ssh w / 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

A następnie w pliku ~ / .ssh / config możesz użyć

Host foohost
    User baruser
    #Password foobarpassword

4

Korzystam z aplikacji VanDyke Software o nazwie SecureCRT .

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

To nie jest darmowe, ale w bardzo przystępnej cenie. Używam go od lat (działając w systemie Windows lub Wine) do zdalnego dostępu, emulacji terminala i (rozproszonego) zarządzania siecią. W końcu wydali natywną wersję Linuksa na początku 2011 roku.

Obsługuje złożone ustawienia logowania (lub skrypty), przechowywane hasła (lub certyfikaty), wiele sesji na kartach itp.

Podczas uruchamiania możesz wybrać, który zdalny cel (i protokół) z ustrukturyzowanej listy (widoku drzewa) przechowywanych zdalnych (lub lokalnych) maszyn, lub po prostu utworzyć połączenie (które jest następnie przechowywane).

Uważam, że jest to szczególnie przydatne w przypadku zdalnych witryn z zaawansowanym uwierzytelnianiem, niestandardowymi portami lub negocjacjami dotyczącymi dostępu do zapory.

Jeśli często korzystasz z dostępu zdalnego (część swojej głównej roli), ta aplikacja uzasadni swój koszt w pierwszym miesiącu użytkowania.


przepraszam, nie rozumiem możesz wytłumaczyć ?
Netmoon,

1
przeredagowany dla ciebie ..
david6

2
Od czasu opublikowania powyższej odpowiedzi nastąpiło kilka iteracji SecureCRT, w tym najnowsza wydana przez VanDyke na początku grudnia 2013 r. Każda iteracja poprawiała program, czyniąc go jeszcze bardziej wszechstronnym. Posiada również bogate API, które pozwala kontrolować / współpracować z skryptami Python / VB. SecureCRT jest częścią mojego podstawowego zestawu narzędzi od dobrej dekady i bardzo go polecam.
Ville,

Zgoda. Nadal testuję wersję beta każdej nowej wersji i byłem mocno zaangażowany we wczesne testowanie w celu przeniesienia do Ubuntu .
david6,

2

Odpowiadając na zadane pytanie, nie, nie można skonfigurować domyślnego hasła w pliku konfiguracyjnym ssh.

Ale jeśli rzeczywiście, jak mówisz, jest to „ponieważ czasami odstaję od komputera i kiedy wracam, wpisz hasło i naciśnij Enterterminal mówi CONNECTION CLOSED , to dlaczego nie zapobiec zamknięciu sesji? SSH może utrzymywać połączenia dla Ciebie.

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

1

Dzięki, Arek za inspirację ...

Zamiast uruchamiania innego procesu powłoki, jest to tylko funkcja działająca w bieżącej powłoce bash. Prowadzi jednego awkpolecenia do analizowania pliku konfiguracyjnego i dowiedzieć się, czy powinien wziąć hasło ze zmiennej powłoki lub z hasłem napisany w czystym tekście do pliku konfiguracyjnego ssh (z awkw sposób evalzamiast describez powodu problemów uderzę użyciu describe).

Próbowałem tak wielu sposobów używania sshpassbezpośrednio w sshpliku konfiguracyjnym za pomocą ProxyCommand, ale nic nie działało zgodnie z oczekiwaniami, z wyjątkiem sytuacji, gdy mogłem zalogować się do skrzynki za pośrednictwem RSA. Ale potem musiałem wysłać hasło, aby otworzyć mój zaszyfrowany katalog. Jednak moja funkcja poniżej wydaje się działać dla mnie we wszystkich przypadkach, nawet dla 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)

Następnie ~/.ssh/configsekcja wygląda następująco:

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

Jeśli #Passvar istnieje sekcja konfiguracji, to zastępuje #Password.
$MYPASS_ENVVARto zmienna środowiskowa przechowująca twoje hasło.

Cieszyć się!


1

Odpowiedź @BrunoPereira na to pytanie pokazuje alternatywną metodę połączenia bez jawnego wprowadzania hasła i unikania kluczy ssh.

Możesz utworzyć skrypt, alias lub funkcję, ~/.bashrcaby szybko wykonać to polecenie.

Oczywiście są to względy bezpieczeństwa, które należy wziąć pod uwagę przy takim podejściu.


Wspaniale jest, że łączysz się z rozwiązaniem, ale dobrą praktyką jest również opublikowanie rozwiązania tutaj. W ten sposób, jeśli link zostanie kiedykolwiek usunięty (jak to czasami bywa przy wymianie stosów), nadal istnieje użyteczna odpowiedź.
Paul

0

Oto moja rozbudowana odmiana odpowiedzi @ ArekBurdach. Oferuje następujące rozszerzenia:

  • gospodarza mogą być w dowolnym miejscu w sshlinii poleceń; tzn. obsługuje również ssh <args> <host> <commands>składnię
  • nie koduje na stałe ścieżki do ssh
  • bardziej niezawodne parsowanie ssh_config
  • Bonus: nakładka na scpzbyt

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

Instalacja

Zdefiniuj aliasy w swoim ~/.bashrc:

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

Konfiguracja

Dzięki IgnoreUnknowndyrektywie sshnie narzeka na nowo wprowadzoną Passworddyrektywę, więc (w przeciwieństwie do odpowiedzi @ ArekBurdach) możemy sprawić, że będzie to wyglądać jak „prawdziwa” konfiguracja. Jeśli ci się to nie podoba, zmiana skryptu na skomentowany jest banalnie.

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

Host foohost
    User baruser
    Password foobarpassword

0

Jeśli nie masz bezpośredniego dostępu do pary kluczy, możesz zaszyfrować hasło na komputerze lokalnym.

Sposobem na to jest zaszyfrowanie hasła przy użyciu klucza oprócz ProxyCommand @Eric Woodruff.

Jednym ze sposobów łączenia jest użycie potoku:

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

gdzie

Host real-destination
    Hostname test.com
    User netmoon

0

Istnieje niewielki wariant sposobu opisanego na blogu, w jaki sposób korzystać, sshpass który można znaleźć tutaj . Biorąc pod uwagę, że masz zaszyfrowane hasło gpg (jak to opisano w blogu), możesz zrobić coś takiego:

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

i po prostu zapisz to polecenie jako alias w swoim .bashrc.

Jeśli chcesz tunelować przez to połączenie, możesz zrobić coś takiego

 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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.