.ssh / configでパスワードを設定して自動ログインを許可できますか?


93

Ubuntu 11.10を使用しています。私はssh毎日多くのサーバーに接続するために使用しているので、次のように.ssh/configファイルにパラメーターを入れます。

Host Home
User netmoon
Port 22
HostName test.com

このファイルに各接続のパスワードを入力する方法はありますか。そのため、サーバーがパスワードを要求すると、端末はパスワードを入力してサーバーに送信しますか?

これが必要なのは、時々PCから離れて、戻ったときにパスワードを入力してEnter、端末が押すと言うからCONNECTION CLOSEDです。

PS公開/秘密キーペアを使用したくありません。


1
私は同じ状況にあり、svnのみにsshアクセスできるため、公開キーをアップロードできません。それは私が私が手のssh svnhostしようとした場合である「(成功(2 2()(編集・パイプラインsvndiff1不在-エントリがコミットリビジョン属性奥行きログ・リビジョン属性部分リプレイ)))」svnserveの応答ではなく、シェル
Uberto

を利用する方法については、unix.stackexchange.com / a / 83991/26493およびandre.frimberger.de/index.php/linux/…を参照してくださいSSH_ASKPASS
オラフディーチェ

回答:


56

セキュリティと利便性のトレードオフは決して終わりません...

パッケージssh-copy-idから使用できますopenssh-clientか?

からman ssh-copy-id

ssh-copy-idは、sshを使用してリモートマシンにログインし、指定されたIDファイルをそのマシンの〜/ .ssh / authorized_keysファイルに追加するスクリプトです。


12
リモート管理者が...公開鍵認証を無効を主張する場合、これは動作しません
トマシュ

2
はい。ただし、直接監督および管理下にあるシステムで現実的であっても、妥協することはありません。たとえば、単一のシートで開発目的のみに使用される外部接続のない迷走仮想マシンで言う。
スコット14年

36
理由のない過酷なセキュリティを主張することも、決して終わりではありません。
cwallenpoole 14

6
時々それはうまく終わります。
devth

3
私見、認証のためのパスワードの主張はそうでないよりも危険です。任意の文字列のセットを覚えているのが嫌いなので、しばしばsshの環境変数として頻繁に使用されるパスワードを設定します。ユーザーに入力を要求することは、保存が不十分であることを単に要求することです。
eggmatters

26

公開キーと秘密キーのペアを実際に使用したくない場合expectは、宛先アドレスに応じて自動的にパスワードを入力するスクリプトを作成できます。

編集:つまり、一方ではexpectパスワードを入力するために使用し、他方では構成ファイルから特定のユーザーおよびホストのパスワードを読み取るスクリプトを使用できるということです。たとえば、次のpythonスクリプトは晴れた日のシナリオで機能します。

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

構成ファイルの形式は次のとおりです。

[user_1]
host1 = passwd_1
host2 = passwd_2

[user_2]
host1 = passwd_1
host2 = passwd_2

注:説明したように、pythonスクリプトは、sshから発生する可能性のあるすべてのエラーと質問メッセージ、および発生する可能性のあるすべてのURLを処理するために、はるかに複雑である必要があります(この例でuser@hostは、ユーザー部分はほとんどの場合はtを使用していました)が、基本的な考え方は同じです。構成ファイルに関しては、別の構成ファイルを使用するか.ssh/config、独自のコードを使用して記述して、そのファイルを解析し、特定のユーザーとホストのパスワードを取得できます。


さらに説明できますか?
Netmoon

@Netmoon私はそれをより明確に私の答えに小さな例を追加しました。
jcollado

これは、の.ssh / configファイルにパスワードを置く方法の質問答えていない
エリック・ウッドラフ

1
確かに、それはその質問に答えません。しかし、問題は解決します。パスワードを手動で入力してファイルに保存する必要がなくなります。これは、OPが必要とするものです。
にArcesilas

19

そのsshpassためのプログラムもあります。使い方: sshpass -p MyPa55word ssh me@myservor.com


29
コマンドの前に(sshpassではなくsshpass)スペースを付けない限り、パスワード( "MyPa55word")をシェルの履歴ファイルに保存したばかりです。
ワルティンレーター

1
@waltinator良い点
イゴール

3
さて、質問者.ssh/configは、シェルの歴史にも参加できたので問題ありませんでした。
ダースエグレギアス

Homebrewには公式にはありませんが、でサードパーティのリポジトリからインストールできますbrew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb。詳細:gist.github.com/arunoda/7790979
ジェイコブフォード

read -s password; sshpass -p "$password" ssh me@myservor.com。これにより、パスワードが履歴に表示されなくなります
Alexander Bird

19

ProxyCommandはどうですか:

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

ssh -W代わりに使用することもできますnc

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

-Wオプションでは期待どおりに動作しません。回避策はありますか?
トアングエン

2
それはまだ...このプロキシコマンドを使用して、パスワードの入力を要求
ビクターPiousbox

1
また、パスワードの入力を求められます。これがしているように見えるのはtest.com、パスワードの要求からパスワードの要求に問題を移すことだけHomeです。ポイントは何ですか?機能させるための秘trickは何ですか?
マーティンブラムウェル

15

いいえ。これは不可能です。

唯一の本当の代替手段は秘密鍵を使用することですが、あなたはしたくないと言いました(なぜですか?)。


7
サーバーに別のキーを配置する権限がないためです。
Netmoon

2
@Netmoon:ログインできる場合は、キーを追加できますか?sysadminが奇妙な設定をしない限り、ホームディレクトリへの書き込みアクセスのみが必要です。
スコットセヴェランス

4
@ScottSeveranceこの質問が指す状況だと思います。キーを追加する機能がありません。はい、それは奇妙ですが、しばしば起こります。
user239558

5
私は公開鍵アクセスが無効になっている共有ホスティング環境の非常に一般的な経験を持っていたので、たとえ鍵を追加できても、それらは使用されません。それをはいた理由に反するが、それは多くのホスティングプロバイダが自分のサーバーをセットアップする方法です
billynoah

1
それが可能であることを示す答えがあります
エリックウッドラフ

8

/ usr / local / binに単純なsshスクリプト置換を作成できます。

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

そして、〜/ .ssh / configファイルで使用できます

Host foohost
    User baruser
    #Password foobarpassword

4

SecureCRTと呼ばれるVanDyke Softwareのアプリケーションを使用します。

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

無料ではありませんが、非常にリーズナブルな価格です。リモートアクセス、ターミナルエミュレーション、および(分散)ネットワーク管理のために(Windowsで実行するか、Wineを使用して)何年も使用しました。彼らはついに2011年の初めにこれのネイティブLinuxバージョンをリリースしました。

複雑なログイン設定(またはスクリプト)、保存されたパスワード(または証明書)、タブ付きの複数セッションなどをサポートしています。

起動時に、保存されたリモート(またはローカル)マシンの構造化リスト(ツリービュー)からどのリモートターゲット(およびプロトコル)を選択するか、単に接続を作成します(その後保存されます)。

これは、高度な認証、非標準ポート、またはファイアウォールアクセスネゴシエーションを備えたリモートサイトに特に役立つことがわかりました。

リモートアクセスを頻繁に行う場合(メインロールの一部)、このアプリケーションは使用の最初の1か月で費用を正当化します。


すみません、わかりません。説明できる ?
Netmoon

1
あなたのために
言い換え

2
上記の回答が投稿されて以来、2013年12月上旬にリリースされたばかりの最新のVanDykeを含む、SecureCRTの反復がいくつかありました。また、Python / VBスクリプトを使用してプログラムを制御/インターフェイスできる豊富なAPIも備えています。SecureCRTは、長年にわたってコアツールキットの一部であり、強くお勧めします。
ヴィル

同意した。私はそれぞれの新しいリリースのベータテストを続けており、Ubuntuに移植するための初期テストに深く関わっていました。
david6

2

あなたが尋ねた質問に答えると、いいえ、ssh configファイルでデフォルトのパスワードを設定することはできません。

しかし、確かに、あなたが言うように、「時々PCから目立たないので、戻るときにパスワードを入力しEnter、ターミナルを押してくださいCONNECTION CLOSED」という場合は、代わりにセッションを閉じないようにしましょう。SSHは接続を維持します。

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

1

アレック、インスピレーションをありがとう...

これは、別のシェルプロセスを実行するのではなく、現在のbashシェルで実行される単なる関数です。これは、単一実行しawk、それが(とシェル変数からまたはSSHの設定ファイルにパスワード書かれた平文のパスワードを取る必要がある場合は設定ファイルを解析して把握するためのコマンドawkevalはなく、describe私が使用してヒットの問題に起因するがdescribe)。

ProxyCommandを使用sshpassしてssh設定ファイルで直接使用する方法をいろいろ試しましたが、RSAを介してボックスにログインできる場合を除いて、期待どおりに動作するようには見えませんでした。しかし、その後、暗号化されたディレクトリを開くためにパスワードを送信する必要がありました。ただし、以下の私の機能は、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)

次に、~/.ssh/configセクションは次のようになります。

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

#Passvar がconfigセクションに存在する場合、 これはをオーバーライドします #Password
$MYPASS_ENVVARパスワードを保持する環境変数です。

楽しい!


1

@BrunoPereiraの答えこの質問は、明示的にパスワードを入力し、SSHキーを回避せずに接続するための別の方法を示しています。

スクリプト、エイリアス、または関数を作成して、~/.bashrcそのコマンドをすばやく実行できます。

明らかに、このアプローチでは考慮すべきセキュリティ上の考慮事項があります。


ソリューションにリンクすることは素晴らしいことです。ただし、先に進んでソリューションをここに投稿することもお勧めします。そのように、リンクがこれまでに削除された場合(時々スタック交換で発生するように)、ここにはまだ有用な答えがあります。
ポール

0

これは、@ ArekBurdachの答えに関する私の手の込んだバリエーションです。以下の拡張機能を提供します。

  • ホストはどこでもにすることができssh、コマンドライン; すなわち、ssh <args> <host> <commands>構文もサポートしています
  • へのパスをハードコードしません ssh
  • より堅牢な解析 ssh_config
  • ボーナス:のラッパー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 "$@")


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

設置

でエイリアスを定義します~/.bashrc

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

設定

IgnoreUnknownディレクティブを使用するとssh、新しく導入されたPasswordディレクティブについて文句を言うことはないため、(@ ArekBurdachの答えとは対照的に)これを「実際の」構成として表示させることができます。これが気に入らない場合は、スクリプトをコメントアウトされたものに戻すのは簡単です。

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

Host foohost
    User baruser
    Password foobarpassword

0

キーペアに直接アクセスできない場合は、ローカルマシンでパスワードを暗号化できます。

その方法は、@ Eric WoodruffのProxyCommandに加えてキー使用してパスワードを暗号化することです

組み合わせる方法はパイプを使用することです:

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

どこ

Host real-destination
    Hostname test.com
    User netmoon

0

ブログで使用方法について説明された方法のわずかな異形がここsshpass に見つけることができます。gpgで暗号化されたパスワード(これはブログで説明されています)ファイルがある場合、次のようなことができます。

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

そのコマンドをエイリアスとしてに保存します .bashrc

その接続をトンネリングする場合は、次のようなことができます

 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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.