簡體   English   中英

Bash腳本可在本地工作,但不能在ssh上工作。 想法為什么?

[英]Bash Script works locally, but not over ssh. Ideas why?

問題:我正在嘗試創建一組腳本,這些腳本將提示用戶輸入IP /主機名和密碼(均可訪問)並通過SSH進入虛擬機。 第二個腳本運行一組命令,以使用各種更新和服務為環境提供基准。

在本地運行時,此腳本可以正常工作。 它顯示主機名,並要求驗證以在該環境上運行更新。

-------------------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

這是我用來將上面的腳本通過管道傳輸到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上運行時,該腳本看起來像它運行了option命令兩次,然后立即結束。 它從不提供允許用戶輸入是/否的選項

我不知道是否與腳本不喜歡的ssh上的用戶輸入有關,但是這個問題讓我很困惑。 我對Bash相當陌生(我正在嘗試的第一個實際腳本),但是語法沒有任何問題。 我有什么想念的嗎?

您有兩個從同一輸入流讀取的不同進程: bash -sbash -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

這是重現問題的更簡單方法:

$ 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.

發生這種情況是因為<意思是“從此文件而不是從終端讀取”。

遠程運行本地腳本而不進行復制的最簡單方法是將其嵌入ssh命令中:

$ ssh -t localhost "$(< script)"
Enter name: World
Hello World
Connection to localhost closed.

請注意,這將在登錄外殼中而不是在shebang指定的任何內容中運行腳本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM