1

期待せずにsshログインするためのスクリプトがあります:

function do_auth_connect(){
    if [ -n "$SSH_ASKPASS_TMPFILE" ]; then
        cat "$SSH_ASKPASS_TMPFILE"
        exit 0
    elif [ $# -lt 1 ]; then
        echo "Usage: echo password | $0 <ssh command line options>" >&2
        exit 1
    fi

    sighandler() {
        rm "$TMP_PWD"
    }

    TMP_PWD=$(mktemp)
    chmod 600 "$TMP_PWD"
    trap 'sighandler' SIGHUP SIGINT SIGQUIT SIGABRT SIGKILL SIGALRM SIGTERM

    export SSH_ASKPASS=$0
    export SSH_ASKPASS_TMPFILE=$TMP_PWD

    [ "$DISPLAY" ] || export DISPLAY=dummydisplay:0
    read password
    echo $password >> "$TMP_PWD"

    # use setsid to detach from tty
    #exec setsid "$@"
    setsid "$@"

    rm "$TMP_PWD"
}

次のようなコマンドを使用する場合:

echo "my_password" | do_auth_connect ssh use@domain "uname -a"

すべて正常に動作します。しかし、私が使用する場合:

read password
echo "$password" | do_auth_connect ssh use@domain "uname -a"

スクリプトがフリーズします。

「set -x」は、スクリプトがループに入り、別の「読み取り」パラメータを待機することを示しています。

どうすればこれを修正できますか? ありがとう

---UPD--- (@Barmar 用)

OK の場合に -x 出力を設定します (scp の例を使用):

+ echo 'user_password'
+ do_auth_connect scp -P 444 user@domain:/home/user/dbg.log /home/user/dbg.log
+ '[' -n '' ']'
+ '[' 5 -lt 1 ']'
++ mktemp
+ TMP_PWD=/tmp/tmp.X8TKTIchq6
+ chmod 600 /tmp/tmp.X8TKTIchq6
+ trap sighandler SIGHUP SIGINT SIGQUIT SIGABRT SIGKILL SIGALRM SIGTERM
+ export SSH_ASKPASS=./1.sh
+ SSH_ASKPASS=./1.sh
+ export SSH_ASKPASS_TMPFILE=/tmp/tmp.X8TKTIchq6
+ SSH_ASKPASS_TMPFILE=/tmp/tmp.X8TKTIchq6
+ '[' :0.0 ']'
+ read password
+ echo 'user_password'
+ setsid scp -P 444 user@domain:/home/user/dbg.log /home/user/dbg.log
+ echo 'user_password'
+ do_auth_connect scp -P 444 user@domain:/home/user/dbg.log /home/user/dbg.log
+ '[' -n /tmp/tmp.X8TKTIchq6 ']'
+ cat /tmp/tmp.X8TKTIchq6
+ exit 0
+ rm /tmp/tmp.X8TKTIchq6
+ exit

そして失敗したとき:

+ read pass
> user_password
+ echo 'user_password'
+ do_auth_connect scp -P 444 user@domain:/home/user/dbg.log /home/user/dbg.log
+ '[' -n '' ']'
+ '[' 5 -lt 1 ']'
++ mktemp
+ TMP_PWD=/tmp/tmp.7usdmtHgqt
+ chmod 600 /tmp/tmp.7usdmtHgqt
+ trap sighandler SIGHUP SIGINT SIGQUIT SIGABRT SIGKILL SIGALRM SIGTERM
+ export SSH_ASKPASS=./1.sh
+ SSH_ASKPASS=./1.sh
+ export SSH_ASKPASS_TMPFILE=/tmp/tmp.7usdmtHgqt
+ SSH_ASKPASS_TMPFILE=/tmp/tmp.7usdmtHgqt
+ '[' :0.0 ']'
+ read password
+ echo 'user_password'
+ setsid scp -P 444 user@domain:/home/user/dbg.log /home/user/dbg.log
+ read -p '> ' pass

これですべてです。^Cは機能しません:)

---UPD2---

「読み取り」を行うと、スクリプトが壊れることがわかりました。次に例を示します。

read null
echo "user_password" | do_auth_connect scp -P 444 user@domain:/home/user/dbg.log ~/dbg.log

フリーズに問題がある

4

3 に答える 3

0
SSH_ASKPASS           If ssh needs a passphrase, it will read the passphrase from
                       the current terminal if it was run from a terminal.  If ssh
                       does not have a terminal associated with it but DISPLAY and
                       SSH_ASKPASS are set, it will execute the program specified by
                       SSH_ASKPASS and open an X11 window to read the passphrase.
                       This is particularly useful when calling ssh from a .xsession
                       or related script.  (Note that on some machines it may be
                       necessary to redirect the input from /dev/null to make this
                       work.)

関連:

(一部のマシンでは、これを機能させるために /dev/null からの入力をリダイレクトする必要があることに注意してください。)

これは非常に曖昧です。ssh コマンドを発行する直前に、アドバイスに従って入力を /dev/null にリダイレクトしてみてください。

于 2012-11-23T15:51:34.287 に答える
-1

コメントを回答としてマークする機能のリクエストは引き続き拒否されるため、上記のソリューションをここにコピーします。

SSH_ASKPASS=$0 を実行すると、「パスワードを取得するには、このスクリプトを再度実行してください」という意味になります。スクリプトが最初にパスを読み取った場合は、もう一度読み取ります。パスワードがすでに一時ファイルに保存されているかどうかを条件とする必要があります。– バーマー

于 2013-11-19T13:45:58.173 に答える