问题:我正在尝试创建一组脚本,提示用户输入IP /主机名&密码(我都有权访问)&然后SSH进入VM。第二个脚本运行一组命令,以使用各种更新和服务为环境布线。
在本地运行时,此脚本可以正常运行。它显示主机名并要求验证以在该环境上运行更新。
------------------- baseline.sh
#!/bin/bash
#filename: baseline.sh
echo "Are you sure you want to run your script on $(hostname -f)?"
OPTIONS="yes no"
select opt in $OPTIONS; do
if [ "$opt" = "yes" ]; then
echo Running Script...
#do script things
exit
elif [ "$opt" = "no" ]; then
echo Canceling Run...
exit
else
echo Please Input Either the # 1 or 2.
fi
done
这是输出:
is-mbp-jsmith:Setting Up Dev Env's jsmith $ sh baseline.sh
Are you sure you want to run your script on is-mbp-jsmith.somecompany.com?
1) yes
2) no
#? 1
Running Script...
此脚本在我的本地计算机上正常工作
------------------------------------------- modifyDevEnv.sh < / p>
以下是我用来将上述脚本传输到VM中的脚本。
#!/bin/bash
#filename: modifyDevEnv.sh
echo Enter a hostname/IP for the Dev Environment to connect to.
read HOST
ssh $HOST -l root 'bash -s' < baseline.sh
以下是运行此脚本时得到的输出:
is-mbp-jsmith:Setting Up Dev Env's jsmith $ sh modifyDevEnv.sh
Enter a hostname/IP for the Dev Environment to connect to.
10.58.88.53
root@10.58.88.53's password:
Are you sure you want to run your script on vm-jsmith.somecompany.com?
1) yes
2) no
#? 1) yes
2) no
#? is-mbp-jsmith:Setting Up Dev Env's jsmith $
当在ssh上运行时,脚本看起来像运行选项命令两次然后立即结束。它永远不会允许用户输入是/否的选项
我不知道它是否与要求脚本不喜欢的用户输入ssh 有关,但这个问题让我感到难过。我对Bash相当新(我尝试的第一个实际脚本),但我没有看到语法有什么问题。有什么我想念的吗?
答案 0 :(得分:2)
您有两个不同的进程从同一输入流中读取:bash -s
,以及bash -s
正在执行的脚本。将脚本复制到远程计算机,然后使用绑定到终端的标准输入执行它将会简单得多。
#!/bin/bash
#filename: modifyDevEnv.sh
echo Enter a hostname/IP for the Dev Environment to connect to.
read HOST
scp baseline.sh root@$HOST:
ssh $HOST -l root basline.sh
答案 1 :(得分:1)
这是一种简单的方法来重现你的问题:
$ cat script
read -p "Enter name: " name
echo "Hello $name"
$ bash script
Enter name: World
Hello World
$ ssh localhost 'bash -s' < script
Enter name:
Hello
Connection to localhost closed.
这是因为<
表示&#34;从终端&#34;中读取此文件而不是。
远程运行本地脚本而不复制本地脚本的最简单方法是将其嵌入ssh命令中:
$ ssh -t localhost "$(< script)"
Enter name: World
Hello World
Connection to localhost closed.
请注意,这将在登录shell中运行脚本,而不是shebang指定的任何脚本。