使用echo修改Hosts文件

时间:2012-01-19 02:16:57

标签: macos bash echo sudo

我有两个简单的脚本,当我不想在每次登录/网络转换时尝试连接时启用/禁用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

还有其他办法吗?

谢谢!

3 个答案:

答案 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'

来自Macworld forums

  

实际的解释是sudo以root身份调用子shell,并且只将它的第一个arg传递给该子shell以运行。

     

一旦命令完成子shell退出,它的标准输出将通过管道传输到&gt;&gt;。这会尝试打开并附加到它的文件参数作为原始UID,由于缺少权限而失败。

     

因此,解决方案是传递整个命令行,包括任何重定向,因此整个事件作为一个arg传递给sudo。

答案 2 :(得分:1)

编辑或创建文件'/etc/hosts.ac'以添加所需的主机条目。当您启动AnyConnect时,该文件将替换'/ etc / hosts'。

不需要脚本附加。