Bash脚本在本地工作,但不在ssh上工作。想法为什么?

时间:2014-11-20 16:08:08

标签: linux bash shell ssh

问题:我正在尝试创建一组脚本,提示用户输入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相当新(我尝试的第一个实际脚本),但我没有看到语法有什么问题。有什么我想念的吗?

2 个答案:

答案 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指定的任何脚本。