如何从 bash 脚本启动交互式 ssh 终端?

How to start interactive ssh terminal from bash script?

我想从 bash 脚本启动 SSH 会话。从文件中读取 $username 和 $hostname 后,交互式 SSH 会话应该像手动启动一样启动。使用 public 键完成登录。

我的代码:

ssh -t -l $username $hostname

这让我看到了 SSH 会话,但我无法与之交互。我该如何解决?

谢谢!

完整脚本:

#!/bin/bash

HOSTS_FILE=".mloginconnections"

echo ""
echo " *****************************"
echo " *                           *"
echo " *  MICWAG SSH LOGIN SYSTEM  *"
echo " *                           *"
echo " *****************************"
echo ""

function handleAdd {
        echo "Add remote host"
        echo ""
        echo "Enter connection alias:"
        read aliasname
        echo "Enter hostname:"
        read hostname
        echo "Enter username:"
        read username

        if [ ! -f $HOSTS_FILE ]
        then
                touch $HOSTS_FILE
        fi

        echo "$aliasname:$hostname:$username" > $HOSTS_FILE
}

function handleConnect {
        if [ $# -ne 1 ] 
        then
                echo "Usage:"
                echo "connect [serveralias]"
        else
                echo "Try to connect to server "

                cat $HOSTS_FILE | while read line
                do
                        IFS=':' read -ra conn <<< $line
                        aliasname=${conn[0]}
                        hostname=${conn[1]}
                        username=${conn[2]}

                        if [ "$aliasname" == "" ] || [ "$hostname" == "" ] 
                        then
                                echo "Found host: $username@$hostname"
                                ssh -tt -l $username $hostname

                        fi
                done
        fi
}

function handleCommand {
        echo "Enter command:"
        read command

        case $command in
        add)
                handleAdd
                ;;
        exit)
                exit
                ;;
        *)
                handleConnect $command
                ;;
        esac
        echo ""
}

while [ 1 ]
do
        handleCommand
done

您需要按照 ssh 手册页中的说明向 -t 提供开关:

ssh -tt -l $username $hostname

手册页的描述:

Multiple -t options force tty allocation, even if ssh has no local tty.

问题是您从 cat $HOSTS_FILE 命令而不是键盘输入 ssh。这就是为什么你不能与之互动的原因。

最简单、最丑陋的修复方法是从当前 tty 重定向:

ssh -t -l $username $hostname < /dev/tty