it-swarm-eu.dev

Můžete nastavit hesla v .ssh / config pro automatické přihlášení?

Používám Ubuntu 11.10. Používám ssh pro připojení k mnoha serverům denně, takže jsem jejich parametry vložil do .ssh/config soubor jako je tento:

Host Home
User netmoon
Port 22
HostName test.com

Existuje způsob, jak do tohoto souboru zadat hesla pro každé připojení, takže když server požádá o heslo, terminál zadá své heslo a odešle jej na server?

Potřebuji to, protože někdy stojím mimo počítač a když se vracím, zadejte heslo a stiskněte Enter terminál říká CONNECTION CLOSED.

P.S. Nechci používat pár veřejných/soukromých klíčů.

98
Netmoon

Obchodování se zabezpečením pro pohodlí nikdy nekončí dobře ...

Mohli byste použít ssh-copy-id z openssh-client balíček?

Z man ssh-copy-id:

ssh-copy-id je skript, který používá ssh k přihlášení ke vzdálenému počítači a připojí uvedený identifikační soubor k souboru ~/.ssh/autorizované_keys tohoto počítače.

55
waltinator

Pokud opravdu nechcete používat pár veřejného/soukromého klíče, můžete napsat skript expect a zadat heslo pro vás automaticky v závislosti na cílové adrese.

Úpravy: Mám na mysli to, že můžete mít skript, který na jedné straně používá expect k zadání hesla pro vás a na druhé straně čte heslo pro daného uživatele a hostitele z konfigurace soubor. Například následující scénář python skript bude fungovat pro scénář slunečného dne:

#!/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 formát konfiguračního souboru bude následující:

[user_1]
Host1 = passwd_1
Host2 = passwd_2

[user_2]
Host1 = passwd_1
Host2 = passwd_2

Poznámka: Jak je vysvětleno, skript python) by musel být mnohem složitější, aby zvládl všechny možné chyby a zprávy o zprávách z ssh a všech možných adres URL (v příkladu se předpokládá, že bude něco jako [email protected], ale uživatelská část se často nepoužívá), ale základní myšlenka by stále byla stejná. Pokud jde o konfigurační soubor, můžete použít jiný konfigurační soubor nebo použít .ssh/config a napište svůj vlastní kód pro analýzu tohoto souboru a získání hesla pro daného uživatele a hostitele.

26
jcollado

A co ProxyCommand:

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

Můžeš použít ssh -W namísto nc:

ProxyCommand sshpass -pmypass ssh [email protected]%h-raw -W localhost:%p
20
Eric Woodruff

K dispozici je také program sshpass. Jak používat: sshpass -p MyPa55Word ssh [email protected]

19
igor

Ne. Obávám se, že to není možné.

Jedinou skutečnou alternativou je použití soukromých klíčů, ale řekli jste, že nechcete (proč ne?).

16
Caesium

Jednoduchou náhradu skriptu ssh můžete vytvořit v/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 pak ve vašem ~/.ssh/config souboru můžete použít

Host foohost
    User baruser
    #Password foobarpassword
8
Arek Burdach

Používám aplikaci od společnosti VanDyke Software s názvem SecureCRT .

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

Není to zdarma, ale velmi cenově dostupné. Použil jsem ji po celá léta (běžící na Windows nebo pomocí Wine) pro vzdálený přístup, emulaci terminálu a (rozptýlenou) správu sítě. Začátkem roku 2011 konečně vydali nativní verzi Linuxu.

Má podporu složitých nastavení přihlášení (nebo skriptů), uložených hesel (nebo certifikátů), záložkových více relací atd.

Při spuštění si můžete vybrat, který vzdálený cíl (a protokol) ze strukturovaného seznamu (stromové zobrazení) uložených vzdálených (nebo místních) počítačů, nebo pouze vytvořit připojení (které se poté uloží).

Zjistil jsem, že je to zvláště užitečné pro vzdálené weby s pokročilým ověřováním, nestandardními porty nebo vyjednáváním o přístupu k bráně firewall.

Pokud děláte vzdálený přístup hodně (část vaší hlavní role), pak tato aplikace ospravedlní své náklady v prvním měsíci používání.

4
david6

Odpověď na otázku, kterou jste položili, ne, není možné nakonfigurovat výchozí heslo v konfiguračním souboru ssh.

Ale pokud, jak říkáte, je to "protože někdy stojím dál od počítače a když se vracím, zadejte heslo a stiskněte Enter terminál říká CONNECTION CLOSED ", tak proč nezabránit uzavření relace místo toho? SSH může udržovat spojení naživu pro vás.

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

Odpověď @BrunoPereira na tato otázka ukazuje alternativní metodu připojení bez výslovného zadání hesla a vyhnutí se ssh klíčům.

Mohli byste vytvořit skript, alias nebo funkci ve svém ~/.bashrc pro rychlé provedení tohoto příkazu.

Je zřejmé, že s tímto přístupem byste měli vzít v úvahu bezpečnostní aspekty.

1
enzotib

Díky, Arek za inspiraci ...

Spíše než spouštět další proces Shell, je to pouze funkce běžící v aktuálním bash Shell. Spustí jediný příkaz awk, který analyzuje konfigurační soubor a zjistí, zda by měl převzít heslo z proměnné Shell nebo z hesla zapsaného v čistém textu do konfiguračního souboru ssh (s awk v eval namísto describe kvůli problémům, na které jsem narazil pomocí describe).

Vyzkoušel jsem tolik způsobů použití sshpass přímo v konfiguračním souboru ssh pomocí ProxyCommand, ale zdálo se, že nic nefunguje tak, jak se očekávalo, s výjimkou případů, kdy jsem se mohl přihlásit do schránky přes RSA a pak jsem potřeboval poslat heslo pro otevření mého šifrovaného adresáře. Zdá se však, že moje funkce níže pro mě funguje ve všech případech, dokonce i pro Cygwina.

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

Pak ~/.ssh/config vypadá takto:

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

Pokud #Passvar existuje v sekci config, což přepíše #Password.
$MYPASS_ENVVAR je proměnná prostředí obsahující vaše heslo.

Užívat si!

1
MerryDan

Pokud nemáte přímý přístup k párům klíčů, můžete na místním počítači zašifrovat heslo.

Způsob, jak to udělat, je zašifrovat své heslo pomocí klíče kromě @Eric Woodruff 's ProxyCommand.

Způsob, jak se spojit, je použití potrubí:

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

kde

Host real-destination
    Hostname test.com
    User netmoon
0
Willian Z

V blogu je malá varianta způsobu, jak používat sshpass, který lze najít zde . Vzhledem k tomu, že máte šifrované heslo gpg (jak je to popsáno v blogu), můžete udělat něco takového:

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

a jednoduše uložte tento příkaz jako alias do svého .bashrc.

Pokud chcete tunelem prostřednictvím tohoto spojení, můžete udělat něco podobného

 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
0
ricffb

Tady je moje komplikovaná varianta odpovědi na @ ArekBurdach. Nabízí následující rozšíření:

  • Host může být kdekoli na příkazovém řádku ssh; tj. podporuje také ssh <args> <Host> <commands> syntaxe
  • nezadává cestu k ssh
  • robustnější parsování ssh_config
  • Bonus: obálka pro scp

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 "[email protected]")


if [ "$password" ]; then
    sshpass -p "$password" "$(which ssh)" "[email protected]"
else
    "$(which ssh)" "[email protected]"
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 "[email protected]")


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

Installation

Definujte aliasy ve svém ~/.bashrc:

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

Konfigurace

Se směrnicí IgnoreUnknown si stěžovatel ssh nestěžuje na nově zavedenou direktivu Password, takže (na rozdíl od odpovědi @ ArekBurdach), můžeme to učinit tak, aby vypadalo jako „skutečné "konfigurace. Pokud se vám to nelíbí, je triviální změnit skript zpět na skript komentovaný.

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

Host foohost
    User baruser
    Password foobarpassword
0
Ingo Karkat