【问题标题】:Using AppleScript to Send Commands and Strings to Terminal.app with Echo Off使用 AppleScript 将命令和字符串发送到 Terminal.app 并关闭 Echo
【发布时间】:2011-07-28 15:35:21
【问题描述】:

我想要完成的事情类似于this question 中描述的事情。基本上是使用 AppleScript 向 Terminal.app 发送命令。

但是我不希望出现这种行为:使用do script 指令发送的每个命令都会回显到终端。我目前正在将 AppleScript 与 Cocoa 集成,有时该软件会将密码等敏感信息发送到终端。

有没有办法禁用这种行为,比如 DOS 批处理文件中的@echo off 指令?

编辑

为了澄清我的问题,我将详细说明。假设我们有一个像这样的 AppleScript:

tell application "Terminal"
    set currentTab to do script "login"
    do script "username" in currentTab
    do script "password" in currentTab
end tell

我注意到,如果终端应用程序已经在运行,无论是否打开任何终端窗口,do script 指令中的命令都会在它被馈送到 shell 之前被回显。在终端中说明上述脚本的结果:

Last login: Tue 5 Apr hh:mm:ss on ttys001
login        <--\
username     <----unwanted echoes
password     <--/
<machine>:~ <user>$ login
username: username
password: ****
... (interactive Terminal session)

但是,如果 Terminal.app 在脚本执行时没有运行,则不会发生这种情况。

【问题讨论】:

    标签: cocoa macos terminal applescript


    【解决方案1】:

    您在 shell 有机会响应它们之前“输入”内容(在这种情况下,在 login 有机会关闭回显之前)。 expect 等工具解决了编写任意命令行实用程序脚本的问题,这在一般情况下会是更好的解决方案,但从您的问题中不清楚您要做什么。

    您要编写什么命令,为什么要通过终端执行?

    【讨论】:

    • 我正在尝试从 Cocoa 应用程序编写 ssh 登录脚本。这就是我需要 Terminal.app 的原因。
    • @avee:如果你不使用 Expect,你很可能最终会重新实现它的一些功能:“wait for "login:";发送用户名;等待“assword:”;发送密码; ……”
    • @Chris Johnsen @Nicholas Riley:谢谢,我想我会看看 Expect
    【解决方案2】:

    要隐藏 Terminal.app 中的命令,首先运行以下命令:

    stty -echo
    

    再次显示命令:

    stty echo
    

    您也可以直接从 AppleScript 运行命令,而不是使用 Terminal.app:

    set theResult to do shell script "cal -y 2011"
    

    或者更好的是,使用 NSTask 直接从 Objective-C 运行命令。
    (由于您的应用使用 Cocoa,我假设它已经(部分)用 Objective-C 编写)

    【讨论】:

    • 感谢您的回答,但这并不是我要问的。我已经编辑了我的问题以澄清我的意思。 do shell script 不起作用,因为我需要一个交互式外壳。出于同样的原因,使用 NSTask 也不起作用。
    猜你喜欢
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多