【问题标题】:Running Applescript From Terminal从终端运行 Applescript
【发布时间】:2014-07-22 20:59:04
【问题描述】:

我一直想学习 AppleScript,所以我一直在尝试创建一个简单的脚本,该脚本将 ssh 到我的开发服务器并在我从终端调用函数时自动输入密码(我知道那里是更好的方法,这只是一个练习)。

这是我的 AppleScript:

tell application "Terminal"
    activate
    set SSH to "ssh git@server.local"
    if (count of windows) is 0 then
        do script SSH
    else
        do script SSH in window 1
    end if
end tell

delay 2

tell application "System Events"
    keystroke "somepassword"
    keystroke return
end tell

在 AppleScript 编辑器中单击“运行”按钮时,这非常有效,但是当尝试从终端 (osascript ~/Desktop/ssh_dev.scpt) 调用它时,它不起作用。

ssh git@server.local 出现在该行上,但不执行,而是换行,这意味着"somepassword" 字符串出现在其下方。

"somepassword" 字符串放入终端后,ssh 命令执行并提示我输入密码。

任何帮助将不胜感激。

【问题讨论】:

  • 不要那样做。如果你想在不输入密码的情况下通过 SSH 连接到服务器,set up public key login
  • @duskwuff 正如我在最初的描述中所说,我知道...只是尝试将其作为练习。

标签: macos terminal applescript


【解决方案1】:

duskwuff 所说的:如果您的用例实际上是 ssh 登录,请使用公钥身份验证。

然而,更一般地说,您的工作场景和非工作场景之间的区别不在于它是从 AppleScript 编辑器运行还是从终端运行。它是从与 ssh 命令相同的窗口还是从不同的窗口运行。您可以通过删除 if/else/endif 使该脚本在终端中像在 AppleScript 编辑器中一样工作,以便终端(它始终打开一个窗口,至少在窗口中键入命令时,因此永远不会有计数为 0) 就像 AppleScript Editor 一样打开一个新的终端窗口:

tell application "Terminal"
    activate
    set SSH to "ssh git@server.local"
    do script SSH
end tell

(** etc. **)

“在窗口 1 中执行脚本 SSH”的问题在于窗口 1 是运行脚本的终端。这意味着脚本必须在窗口 1 中完成,然后窗口 1 才能执行给定的命令.

但是当脚本完成时,密码已经被键入,并且 ssh 在它请求之前不接受密码数据。当通过慢速连接手动登录时,您可能已经看到类似的事情发生。如果您在 ssh 请求之前输入密码的开头,则 ssh 会忽略这些字符。

如果您愿意后台处理该过程,我可以想出一种解决此问题的方法。如果您只是在命令末尾添加一个&符号,它会进入后台;这意味着终端现在正在接受输入。

osascript ~/Desktop/ssh_dev.scpt&

这有点笨拙,因为您也可以在终端中键入,并且可以在 2 秒延迟结束之前轻松键入,从而抢占 AppleScript 键入的文本。但它会起作用。

同样,如果您不习惯使用 osascript 和文本文件,您可以将脚本保存为应用程序集以保持打开状态,然后将密码注入到空闲处理程序中。但是,这与您要求的条件相去甚远。

另一种选择可能是查看“expect”(使用“man expect”)。您应该能够在 AppleScript 中构建一个 expect 命令行,该命令行将成功地为 ssh 提供密码,但为此目的变得非常复杂。

【讨论】:

  • 谢谢杰瑞。我在使用此解决方案时遇到的问题是,当它从终端运行时,它会打开一个新的终端窗口来运行命令(有效),但我希望命令在当前终端窗口中运行。有什么想法吗?
  • 不幸的是,您在这里遇到了过程脚本的基本限制。在脚本发送密码之前,脚本必须将控制权交还给终端。如果这只是供您使用,一种选择是在命令行上运行命令时将 & 符号放在命令的末尾。我会将其添加到答案中。
【解决方案2】:

如果您已经将终端设置为“活动”窗口,那么:

它丢失了tell process,这可能是问题所在

tell application "System Events" to tell process "Terminal"
    keystroke "somepassword" as text
    key code 36 -- return
end tell

这是一种方法。

此外,当您运行终端脚本时,您可以通过说 do script 开始,然后您想要运行的任何脚本都应该是 do script "blah" in window 1in front window

或者另一个建议,虽然这是未经测试的......

tell application "Terminal"
    activate
    do script "ssh git@server.local"
    do script "somepassword" in front window
end tell

这应该只是运行“somepassword”脚本,就像你输入它并按回车一样......(我认为)

回应: “我在使用此解决方案时遇到的问题是,当它从终端运行时,它会打开一个新的终端窗口来运行命令(有效),但我希望该命令在当前终端窗口中运行。有什么想法吗? "

try
    do script "" in front window
on error
    do script ""
end try

如果存在,这将在前窗口中执行脚本。如果没有,那么它将打开一个新的。

【讨论】:

    猜你喜欢
    • 2017-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多