通过cURL

时间:2018-04-05 19:03:33

标签: linux bash shell curl

我有一个简单的 bash 脚本,它接受输入并使用输入打印几行

fortinetTest.sh

read -p "Enter SSC IP: $ip " ip && ip=${ip:-1.1.1.1}
printf "\n"

#check IP validation
if [[ $ip =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
  echo "SSC IP: $ip"
  printf "\n"
else
  echo "Enter a valid SSC IP address. Ex. 1.1.1.1"
  exit
fi

enter image description here

我尝试将它们上传到我的服务器,然后尝试通过curl

运行它

enter image description here

当我使用cURL / wget时,不确定为什么输入提示永远不会启动。

我错过了什么吗?

问题

如何继续进行调试?

我现在对任何建议持开放态度。

任何提示/建议/帮助都将非常感谢!

3 个答案:

答案 0 :(得分:17)

使用curl ... | bash表单时,bash的stdin正在读取脚本,因此stdin不适用于read命令。

尝试使用Process Substitution像本地文件一样调用远程脚本:

bash <( curl -s ... )

答案 1 :(得分:9)

您可以通过运行以下脚本轻松复制您的问题

UIButton

这是因为您使用UIButton启动的bash未获得$ cat test.sh | bash Enter a valid SSC IP address. Ex. 1.1.1.1 ,当您执行pipe时,会从TTY读取该内容在这种情况下read -p。所以问题不在于卷曲。问题不在于读取tty

所以修复是为了确保你从tty

做好准备
stdin

一旦你这样做,即使test.sh也会开始工作

read < /dev/tty -p "Enter SSC IP: $ip " ip && ip=${ip:-1.1.1.1}
printf "\n"

#check IP validation
if [[ $ip =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
  echo "SSC IP: $ip"
  printf "\n"
else
  echo "Enter a valid SSC IP address. Ex. 1.1.1.1"
  exit
fi

答案 2 :(得分:0)

我个人更喜欢source <(curl -s localhost/test.sh)选项。虽然它类似于bash ...,但一个显着的区别是过程如何处理。

bash将导致新进程被启动,该进程将从脚本中唤起命令。
另一方面,source将使用当前进程来唤起脚本中的命令。

在某些情况下可以发挥关键作用。我承认这不是经常发生的事。

要演示如下操作:

### Open Two Terminals
# In the first terminal run:
echo "sleep 5" > ./myTest.sh
bash ./myTest.sh

# Switch to the second terminal and run:
ps -efjh

## Repeat the same with _source_ command
# In the first terminal run:
source ./myTest.sh

# Switch to the second terminal and run:
ps -efjh

结果应与此类似:

执行前:

before

运行bash(主要+两个子流程):

bash

运行source(主要+一个子流程):

source

<强>更新 bashsource使用变量使用情况的差异:

source命令将使用您当前的环境。这意味着在执行时,脚本生成的所有更改和变量声明都将在您的提示中可用。

另一方面,

bash将作为一个不同的过程运行;因此,当进程退出时,所有变量都将被丢弃。

我想每个人都会同意每种方法都有好处和缺点。您只需决定哪一个更适合您的用例。

## Test for variables declared by the script:
echo "test_var3='Some Other Value'" > ./myTest3.sh
bash ./myTest3.sh
echo $test_var3
source ./myTest3.sh
echo $test_var3

Testing setting environment variables by the script

## Test for usability of current environment variables:
test_var="Some Value" # Setting a variable
echo "echo $test_var" > myTest2.sh # Creating a test script
chmod +x ./myTest2.sh # Adding execute permission
## Executing:
. myTest2.sh
bash ./myTest2.sh
source ./myTest2.sh
./myTest2.sh
## All of the above results should print the variable.

Testing access to environment variables with different execution methods.

我希望这会有所帮助。