通过cURL远程执行Bash脚本

kyo*_*kyo 13 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
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

在此输入图像描述

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

我错过了什么吗?


问题

如何进行并进一步调试?


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

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

gle*_*man 17

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

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

bash <( curl -s ... )
Run Code Online (Sandbox Code Playgroud)

  • 然后下载脚本显然是错误的解决方案.你想要`ssh -t user @ host'bash script.sh' (3认同)
  • "不起作用"是一个无用的问题描述.提供细节. (3认同)

Tar*_*ani 9

您可以通过运行下面的脚本简单地重现您的问题

$ cat test.sh | bash
Enter a valid SSC IP address. Ex. 1.1.1.1
Run Code Online (Sandbox Code Playgroud)

这是因为你使用a启动的bash pipe没有得到a TTY,当你执行a时,read -p它是从这种情况下读取的stdin内容test.sh.所以问题不在于卷曲.问题不是从tty读取

所以解决方法是确保你从tty准备它

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
Run Code Online (Sandbox Code Playgroud)

一旦你这样做,甚至curl会开始工作

vagrant@vagrant:/var/www/html$ curl -s localhost/test.sh | bash
Enter SSC IP:  2.2.2.2

SSC IP: 2.2.2.2
Run Code Online (Sandbox Code Playgroud)