我molly-guard
在所有机器上使用,但有时我想 ssh 进入一台机器并执行一个脚本,作为最后一步应该重新启动该机器,但随后出现问题molly-guard
并提示我输入主机名。
我正在寻找类似--molly-guard-do-nothing
标志的东西,但它不会什么都不做,而是会被调用--molly-guard-do-not-ask
并且不会要求确认。
手册页没有这方面的信息,所以我想知道是否有解决方法。
我只需要在通过 ssh 连接到机器后才能使用它;也就是说,在 cronjob 等上下文中永远不需要它,但我不介意它是否也能工作。
更具体地说,这是有问题的脚本:
sudo apt-get update && apt list --upgradable
echo ""
echo "---- ok. what next? ----"
echo ""
read -n 1 -p "exit or upgrade? (E/u) " ans;
case $ans in
u|U) printf "\n\nok, invoking 'sudo apt-get upgrade'\n\n"; sudo apt-get upgrade;;
*) printf "\nok, exited\n\n"; exit;;
esac
echo ""
echo "---- ok. what next? ----"
echo ""
read -n 1 -p "exit, autoremove or reboot? (E/a/r) " ans;
case $ans in
a|A) printf "\n\nok, invoking 'sudo apt-get autoremove'\n\n"; sudo apt-get autoremove;;
r|R) printf "\n\nok, invoking 'sudo reboot'\n\n"; sudo reboot;;
*) printf "\nok, exited\n\n"; exit;;
esac
echo ""
echo "---- ok. what next? ----"
echo ""
read -n 1 -p "exit or reboot? (E/r) " ans;
case $ans in
r|R) printf "\n\nok, invoking 'sudo reboot'\n\n"; sudo reboot;;
*) printf "\nok, exited\n\n"; exit;;
esac
答案1
默认情况下molly-guard
,仅当它认为处于交互式 SSH 登录中时才提示输入主机名。它通过检查其标准输入流是否连接到充当终端的设备来确定“交互”状态。 (具体来说,它的30-query-hostname
子脚本test -t 0 || exit 0
在到达发出提示的代码之前执行。)
您可以通过运行脚本并将其标准输入从非终端重定向来强制该测试失败。 /dev/null
将是传统的选择,例如:
$ my_script_that_will_trigger_a_reboot </dev/null
如果您的脚本需要在重新启动之前从终端获取输入,因此您无法在标准输入重定向的情况下运行脚本,那么您可以修改脚本以仅为命令重定向标准输入reboot
。也许甚至可以给你的脚本一个选项,告诉它是否在 上进行重定向reboot
,这样默认情况下它仍然会受到 的molly-guard
干预。