【问题标题】:How to create an Applescript to execute terminal commands and password如何创建 Applescript 来执行终端命令和密码
【发布时间】:2014-01-27 22:36:46
【问题描述】:

我四处寻找,但找不到适合我的问题的东西。

我想创建一个脚本来复制以下内容:

  1. 打开终端

  2. 执行以下命令:

    sudo kextunload /System/Library/Extensions/AppleHDA.kext
    
  3. 然后让它为我输入我的 OSX 管理员密码。

  4. 然后执行以下:

    sudo kextload /System/Library/Extensions/AppleHDA.kext
    

我对applescript完全陌生,所以希望有人可以帮助我。

谢谢!

【问题讨论】:

  • 查看“do shell script”命令(它来自“StandardAdditions”)——在 AppleScript-Editor 中,打开“Library”(参见菜单“Window”)并双击“StandardAdditions”。在搜索字段中输入“do shell”。

标签: macos terminal passwords applescript osx-mavericks


【解决方案1】:

对该问题的评论中的提示是正确的(在 [Apple] 脚本编辑器中,选择 File > Open Dictionary...,选择 StandardAdditions.osax,然后搜索 do shell script 以查看完整的语法),但重要的是要注意do shell script 不会打开终端窗口;相反,它会运行隐藏的 shell 命令并返回其结果 - 这通常是更可取的:

  • do shell script 的返回值是 shell 命令的 stdout 输出。
  • 如果 shell 命令返回非零退出代码,AppleScript 将抛出错误,错误消息将包含命令的 stderr 输出。

要以管理权限运行命令,您有 2 个选项:

  • [推荐]让AppleScript显示密码提示
set shCmds to "kextunload /System/Library/Extensions/AppleHDA.kext;
kextload /System/Library/Extensions/AppleHDA.kext"

# This will prompt for an admin password, then execute the commands
# as if they had been run with `sudo`.
do shell script shCmds with administrator privileges  
  • [不推荐出于安全原因]将密码作为参数传递
set shCmds to "kextunload /System/Library/Extensions/AppleHDA.kext;
kextload /System/Library/Extensions/AppleHDA.kext"

# Replace `{myPassword}` with your actual password.
# The commands will run as if they had been executed with `sudo`.
do shell script shCmds ¬
   user name short user name of (system info) password "{myPassword}" ¬
   with administrator privileges 

如前所述,如果出现问题 - 无论是由于密码无效或取消密码对话框,还是 shell 命令返回非零退出代码 - 都会引发运行时错误。 这是一个捕获它并通过display alert报告它的示例。

try
    do shell script shCmds with administrator privileges
on error errMsg number errNo
    display alert "Executing '" & shCmds & "' failed with error code " & ¬
        errNo & " and the following message: " & errMsg
    return
end try

【讨论】:

  • 感谢@mklement0 的详细回复。我会试试这个并报告回来。添加错误处理是什么样的? (对不起,我对这一切都不熟悉)。
  • 我试了一下,我复制并粘贴了第一个sn-p和错误处理sn-p并点击运行。结果是失去了我的声音控制,我通过重新启动来修复它。我可能做错了什么。知道它可能是什么吗?
  • @Adrius:如果您在终端中以交互方式运行相同的命令,它会起作用吗?卸载和加载帮助之间是否会有延迟(在命令之间插入sleep 2)?你想达到什么目的? 如果这是关于在唤醒 MacBook 后修复声音丢失:可能的(没有尝试过,因为我没有遇到问题)解决方法,例如“删除Macintosh HD > Library > Preferences > Audio 中的 2 个 plist 文件,然后重新启动似乎完美地解决了我的问题。”可以在discussions.apple.com/thread/5482053?start=180&tstart=0找到
  • 这正是我要解决的问题。当我单独运行这些命令时,它可以工作。我可以尝试在命令之间添加sleep 2(只需将其放在两者之间的新行上?)。我会尝试删除 plist 文件,但我对删除文件很偏执。据您所知,这会破坏什么吗?
  • 重新破解:我不知道,但我认为不会 - 如果您尝试,请务必先将它们移动到其他地方,这样您就可以恢复他们。回复sleep:使用set shCmds to "kextunload /System/Library/Extensions/AppleHDA.kext; sleep 2; kextload /System/Library/Extensions/AppleHDA.kext"。论坛帖子中的某个人还提到了 OnyX,这是一个很棒的免费软件维护实用程序,您可以使用它来清除缓存的信息,看看是否有帮助 - titanium.free.fr/downloadonyx.php - “彻底清除,尤其是声音设置。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多