我正在尝试创建一个简单的脚本,通过ssh登录到各种服务器,所有密钥都已安装并正在运行,但我根本无法让这个脚本为我工作。基本上有一个选项,用户希望登录到哪个服务器,但它不断抛出以下错误:
': not a valid identifier `INPUT
login.sh: line 24: syntax error near unexpected token `elif'
'ogin.sh: line 24: `elif [ $INPUT -eq 2 ] ; then
脚本布局可以在下面找到虚拟信息:
#!/bin/bash
echo "What Server would you like to login to?"
echo ""
echo ""
echo "1. Server 1"
echo "2. Server 2"
echo "3. Server 3"
echo "4. Server 4"
echo "5. Exit"
read INPUT
if [ $INPUT -eq 1 ] ; then
echo"Logging in"
echo"..."
ssh root@1.2.3.4 -p 5678
elif [ $INPUT -eq 2 ] ; then
echo"Logging in"
echo"..."
ssh root@1.2.3.4 -p 5678
elif [ $INPUT -eq 3 ] ; then
echo"Logging in"
echo"..."
ssh root@1.2.3.4 -p 5678
elif [ $INPUT -eq 4 ] ; then
echo"Logging in"
echo"..."
ssh root@1.2.3.4 -p 5678
elif [ $INPUT -eq 5 ] ; then
exit 0
else
echo "invalid choice"
return
fi
任何帮助都会非常感激,使用bash相对较新,现在这只是让我感到烦恼!
答案 0 :(得分:3)
看起来像是在Windows上创建了这个文件。 尝试,使用dos2unix,如:
dos2unix <your_script>
答案 1 :(得分:1)
这个答案实际上只是一个评论,但评论不适合代码。你的脚本可以大大简化。考虑类似的事情:
#!/bin/bash
servers=( host1 host2 host3 )
ips=( 192.168.1.1 192.168.1.2 192.168.1.3 )
ports=( 123 22 33 )
select server in ${servers[@]}; do
echo "Logging into $server..."
ssh root@${ips[$REPLY]} -p ${ports[$REPLY]}
break
done
(虽然一点也不清楚为什么你想要指定IP地址而不是使用主机名!)
答案 2 :(得分:0)
通过复制粘贴来尝试你的脚本,它有效。我对它进行了一些修改,以使无效选择选项起作用。
呃...对不起,但它对我有用吗?
#!/bin/bash
while true ; do
echo "What Server would you like to login to?"
echo ""
echo ""
echo "1. Server 1"
echo "2. Server 2"
echo "3. Server 3"
echo "4. Server 4"
echo "5. Exit"
read INPUT
if [ $INPUT -eq 1 ] ; then
echo "Logging in 1"
echo "..."
ssh root@1.2.3.4 -p 5678
elif [ $INPUT -eq 2 ] ; then
echo "Logging in 2"
echo "..."
ssh root@1.2.3.4 -p 5678
elif [ $INPUT -eq 3 ] ; then
echo "Logging in 3"
echo "..."
ssh root@1.2.3.4 -p 5678
elif [ $INPUT -eq 4 ] ; then
echo "Logging in 4"
echo "..."
ssh root@1.2.3.4 -p 5678
elif [ $INPUT -eq 5 ] ; then
exit 0
else
echo "invalid choice"
fi
done
答案 3 :(得分:0)
我会回答你在这个问题上没有提出的问题,把自己扔在SO巴士前面。为什么不使用select
?
echo 'Which server would you like to log into?'
select server in 192.168.0.1 192.168.0.2 192.168.0.3 192.168.0.4; do
printf 'Logging in to server %s...\n' "$server"
ssh "$server" -p "$port"
done
如果你不喜欢select
,为什么不至少使用case
?
read -p 'Which server do you want? ' input
case "$input" in
whatever)
printf 'Logging in to server %s...\n' "$server"
ssh "$server" -p "$port"
;;
*)
echo 'Invalid option'
;;
esac
答案 4 :(得分:0)
我意识到这并没有回答你的问题,但是你说你是bash的新手。我建议使用case语句而不是乱七八糟的ifs,我还在read语句中添加了一个提示符(使用-p选项)。您也可以查看select语句而不是大小写。
#!/bin/bash
echo "What Server would you like to login to?"
echo ""
echo ""
echo "1. Server 1"
echo "2. Server 2"
echo "3. Server 3"
echo "4. Server 4"
echo "5. Exit"
read -p "cmd> " INPUT
case $INPUT in
1)
echo "Logging in"
echo "..."
echo ssh root@1.2.3.4 -p 5678
;;
2)
echo "Logging in"
echo "..."
echo ssh root@1.2.3.4 -p 5678
;;
3)
echo "Logging in"
echo "..."
echo ssh root@1.2.3.4 -p 5678
;;
4)
echo "Logging in"
echo "..."
echo ssh root@1.2.3.4 -p 5678
;;
5)
echo "exiting"
exit 0
;;
*)
echo "invalid choice"
return
;;
esac