如何从 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
我想从 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