【问题标题】:How to start interactive ssh terminal from bash script?如何从 bash 脚本启动交互式 ssh 终端?
【发布时间】:2015-07-29 20:39:27
【问题描述】:

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

我的代码:

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 $1"

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

                        if [ "$aliasname" == "$1" ] || [ "$hostname" == "$1" ] 
                        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

【问题讨论】:

  • 能否请您附上完整的脚本和您运行它的完整记录?如果您觉得需要缩写/审查脚本,请在运行它以获得输出之前执行此操作,而不是运行您的实际脚本,然后发布您从未实际运行过的编辑代码。
  • 脚本是如何执行的?如果它来自终端会话,它应该检测并使用来自父会话的 TTY。
  • 脚本是从本地终端会话执行的,但我无法将输入发送到服务器。

标签: linux bash ssh


【解决方案1】:

问题是您通过cat $HOSTS_FILE 命令而不是键盘输入ssh。这就是你无法与之交互的原因。

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

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

【讨论】:

  • 感谢这项工作!但为什么会被认为是丑陋的呢?这不是最简单最干净的解决方案吗?
【解决方案2】:

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

ssh -tt -l $username $hostname

手册页的描述:

多个 -t 选项强制分配 tty,即使 ssh 没有本地 tty。

【讨论】:

  • 我也试过这个,但它没有帮助我。看起来我的输入没有发送到服务器。
  • 好的。如果问题是关于交互式输入,那么我建议您创建 expect 脚本来为您处理 IO。
  • -texpect 都不起作用,因为 ssh 的标准输入是主机名列表,而不是终端或用户输入。
  • 脚本应该只打开ssh会话,然后我想手动输入命令。
猜你喜欢
  • 1970-01-01
  • 2016-03-28
  • 1970-01-01
  • 2012-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多