【问题标题】:Is there a way to enter a response for a shell script in AppleScript?有没有办法在 AppleScript 中输入对 shell 脚本的响应?
【发布时间】:2015-01-16 22:47:30
【问题描述】:

有没有办法响应在 AppleScript 中询问信息的 shell 脚本?

我有一个脚本,它运行一个在终端中运行时会询问两个问题的命令。

我已经知道答案,而且我必须这样做一千次。有没有办法可以输入这些响应,以便当 shell 脚本提示我输入它们时,它会继续该过程?

例子:

on run {email}
    set result to do shell script "myprocess \"" & email & "\""
    keystroke "file.png" + "enter" 
    keystroke "y" + "enter"
    return result
end run

我得到的错误是:

error "Enter the file name to save:"

...这是终端中要求我输入值的提示。

注意:它与this 问题非常相似,但我不想打开终端窗口。我想留在 AppleScript 中。

【问题讨论】:

    标签: applescript


    【解决方案1】:

    是和不是。虽然do shell script 不允许您与流程进行交互,但您似乎并不需要这样做。由于您有一个已知的响应,您可以将响应放在一个文件中并将stdin 重定向到myprocess

    类似这样的:

    do shell script "myprocess \"" & email & "\" < responses.txt"
    

    responses.txt 是一个包含以下内容的文件:

    file.png
    y
    

    【讨论】:

    • 所以每个响应都在单独的行上?是否有返回命令的响应?有些是可选的,只需按 Enter 键即可继续。
    • 每行末尾的换行符是您提供的输入的一部分。因此,文件中的空行对应于只需按 Enter。
    【解决方案2】:

    如果您必须响应来自 shell 命令的提示和内容,您可以创建一个“预期”bash 脚本。您可以直接在 applescript 中执行此操作。

    这是一个例子。假设我想通过 SSH 登录计算机,运行几个命令,然后退出。我知道在命令行我必须首先 ssh 进入机器的 IP 地址,然后我必须等待机器要求我输入密码,然后我必须输入密码,然后我再次等待等等。我可以使用 applescript 中的 expect 脚本来做到这一点,如下面的脚本。注意这一行:

    expect \\\"password:\\\"
    

    是我通过期待“密码:”命令行提示符来等待密码请求的地方。收到该提示后,我发送密码:

    send \\\"$PASS\\r\\\"
    

    您可以看到我随后发出一些其他 ssh 命令并最终退出脚本。所以希望这能让您了解如何编写代码。您可以 google 以获取有关“预期”脚本的更多想法。

    为了解释反斜杠...在 bash 脚本中,我们将在 expect 命令中使用 \" 来转义引号。由于我们在 applescript 中,因此我们必须转义这些内容,因为它们具有特殊含义applescript 所以它变成 \\" 是 \ 发送反斜杠和 \" 发送报价。

    祝你好运。

    set shScript to "#!/bin/bash
    
    HOST=192.168.1.xxx
    USER=username
    PASS=passwrd
    PROMPT=#
    
    expect -c \"
    spawn ssh $USER@$HOST
    expect \\\"password:\\\"
    send \\\"$PASS\\r\\\"
    expect \\\"$PROMPT\\\"
    send \\\"cd /\\r\\\"
    expect \\\"$PROMPT\\\"
    send \\\"ls -al\\r\\\"
    expect \\\"$PROMPT\\\"
    send \\\"exit\\r\\\"
    \"
    "
    
    do shell script "sh -c " & quoted form of shScript
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-03
      • 2020-09-30
      • 1970-01-01
      • 2023-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-05
      相关资源
      最近更新 更多