Son*_*c84 3 macos bash sudo echo
我有两个简单的脚本,当我不希望它尝试在每次登录/网络转换时进行连接时,可以启用/禁用Cisco AnyConnect。一切都很好,但我也想在主机文件中添加一行。我对大多数命令使用“ echo $ password | sudo -S”的原因是因为此脚本是从Mac OS X的脚本菜单运行的。终端窗口未打开以解决sudo密码提示。
#!/bin/bash
#Start_AnyConnect.command
password=`/usr/bin/osascript <<EOT
with timeout of (30 * 60) seconds
tell application "Finder"
activate
set myReply to text returned of (display dialog "Enter your password to authorize AnyConnect startup script" default answer "" with hidden answer)
end tell
end timeout
EOT`
echo $password | sudo -S echo -e "127.0.0.1\twpad.company.com" >> /etc/hosts
sleep 2
echo $password | sudo -S mv "/Library/LaunchAgents_Disabled/com.cisco.anyconnect.gui.plist" "/Library/LaunchAgents/com.cisco.anyconnect.gui.plist"
echo $password | sudo -S mv "/Library/LaunchDaemons_Disabled/com.cisco.anyconnect.vpnagentd.plist" "/Library/LaunchDaemons/com.cisco.anyconnect.vpnagentd.plist"
echo $password | sudo -S launchctl load /Library/LaunchDaemons/com.cisco.anyconnect.vpnagentd.plist
sleep 5
open /Applications/Cisco/Cisco\ AnyConnect\ Secure\ Mobility\ Client.app
exit 0
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是
echo $password | sudo -S echo -e "127.0.0.1\twpad.company.com" >> /etc/hosts
Run Code Online (Sandbox Code Playgroud)
将“ -e 127.0.0.1\twpad.company.com”代替“ 127.0.0.1 wpad.company.com” 附加到hosts文件。
如果我自己运行以下命令,它将按预期工作:
sudo echo -e "127.0.0.1\twpad.company.com" >> /etc/hosts
Run Code Online (Sandbox Code Playgroud)
还有另一种方法吗?
谢谢!
echo正在运行的版本不支持-e. 当您使用时,sudo您会得到/bin/echo而不是 shell 的 builtin echo。使用printf来代替:
echo $password | sudo -S printf "127.0.0.1\twpad.company.com\n" >> /etc/hosts
Run Code Online (Sandbox Code Playgroud)
另外,请参阅 Jaypal 关于重定向和sudo.
这对我在OSX上有效(最近在优胜美地进行了测试。)希望它对其他人有帮助!
sudo sh -c 'echo "127.0.0.1\twpad.company.com\n" >> /etc/hosts'
Run Code Online (Sandbox Code Playgroud)
实际的解释是sudo以root身份调用了一个子shell,并且仅将其第一个arg传递给该子shell来运行。
命令完成后,子shell退出,并且标准输出通过管道传递到>>。这会尝试打开并附加到其文件参数作为原始UID,但由于缺少特权而失败。
因此,解决方案是传递整个命令行,包括任何重定向,因此将整个内容作为一个arg传递给sudo。