You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AppleScript中执行多条Shell命令,如何仅一次请求sudo密码?

解决AppleScript多次输入sudo密码的问题

核心方案

把所有需要sudo权限的route命令合并成一次do shell script调用,利用sudo的凭据缓存机制仅请求一次密码;同时修正日志写入逻辑,避免不必要的权限请求(桌面文件默认无需sudo即可写入)。

修改后的代码

-- 合并所有sudo路由操作到一次shell调用,仅触发一次密码验证
set routeOutput to do shell script "sudo route delete " & MyURL_IP & "; sudo route delete " & MyURL_IP2 & "; sudo route -nv add " & MyURL_IP & " " & IPAdrGatway & " | grep 'add host'; sudo route -nv add " & MyURL_IP2 & " " & IPAdrGatway & " | grep 'add host'"

beep -- 删除路由完成提示
beep -- 添加路由完成提示

-- 写入日志(无需sudo,桌面属于当前用户可读写路径)
set the logFile to ((path to desktop) as text) & "RouteAirmail.log.txt"
try
    open for access file the logFile with write permission
    write (return & (current date) & return) to file the logFile starting at eof
    write (routeOutput & return) to file the logFile starting at eof
    close access file the logFile
on error
    try
        close access file the logFile
    end try
end try

关键说明

  • 合并sudo命令:用分号;分隔多个shell命令,一次性通过sudo执行,sudo会缓存凭据(默认5分钟),同会话内后续sudo命令无需重复输入密码。
  • 日志写入修正:当前用户的桌面目录默认拥有完全读写权限,无需sudo。若之前写入时提示密码,大概率是旧日志文件权限被意外修改,删除旧文件后重新运行脚本即可。
  • 输出捕获优化:将所有路由操作的输出合并到routeOutput变量,简化日志写入逻辑。

可选优化(清晰输出分隔)

如果需要区分删除/添加路由的输出,可以在shell命令中添加标记:

set routeOutput to do shell script "echo '=== 删除路由 ==='; sudo route delete " & MyURL_IP & "; sudo route delete " & MyURL_IP2 & "; echo '=== 添加路由 ==='; sudo route -nv add " & MyURL_IP & " " & IPAdrGatway & " | grep 'add host'; sudo route -nv add " & MyURL_IP2 & " " & IPAdrGatway & " | grep 'add host'"

内容的提问来源于stack exchange,提问作者UweTheSailor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 10:33:25