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
相关产品推荐
相关产品推荐

