我有两个简单的脚本,当我不想在每次登录/网络转换时尝试连接时启用/禁用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
我遇到的问题是
echo $password | sudo -S echo -e "127.0.0.1\twpad.company.com" >> /etc/hosts
将“-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
还有其他办法吗?
谢谢!
答案 0 :(得分:4)
正在运行的echo
版本不支持-e
。当您使用sudo
时,您获得/bin/echo
而不是shell的内置echo
。请改用printf
:
echo $password | sudo -S printf "127.0.0.1\twpad.company.com\n" >> /etc/hosts
另外,请参阅Jaypal关于重定向和sudo
的评论中的问题。
答案 1 :(得分:4)
这对我在OSX上工作(最后在Yosemite上测试过。)希望它可以帮助别人!
sudo sh -c 'echo "127.0.0.1\twpad.company.com\n" >> /etc/hosts'
实际的解释是sudo以root身份调用子shell,并且只将它的第一个arg传递给该子shell以运行。
一旦命令完成子shell退出,它的标准输出将通过管道传输到&gt;&gt;。这会尝试打开并附加到它的文件参数作为原始UID,由于缺少权限而失败。
因此,解决方案是传递整个命令行,包括任何重定向,因此整个事件作为一个arg传递给sudo。
答案 2 :(得分:1)
编辑或创建文件'/etc/hosts.ac'以添加所需的主机条目。当您启动AnyConnect时,该文件将替换'/ etc / hosts'。
不需要脚本附加。