【问题标题】:Sending commands and strings to Terminal.app with Applescript使用 Applescript 向 Terminal.app 发送命令和字符串
【发布时间】:2010-12-24 14:59:45
【问题描述】:

我想做这样的事情:

tell application "Terminal"
  activate
  do script "ssh user@server.com"
  -- // write user's password
  -- // write some linux commands to remote server
end tell

例如登录服务器,输入密码,然后登录mysql,选择一个DB。
我每天都会输入它,将它捆绑到脚本中会真的很有帮助。

另外,是否有关于哪些命令、属性、函数等的参考?应用程序(终端、Finder 等)可以在 Applescript 中使用吗?谢谢!

编辑:让我澄清一下: 我不想做几个“做脚本”,因为我尝试过并且不起作用。 我想打开一个终端窗口,然后模拟一个人输入一些字符并按回车键。可能是密码,可能是命令,无论如何,只是将字符发送到恰好正在运行 ssh 的终端。我尝试了按键,但似乎不起作用。

【问题讨论】:

    标签: macos terminal applescript


    【解决方案1】:

    首先连接到服务器并等待 6 秒(您可以更改它),然后使用相同的选项卡在远程服务器上执行您需要的任何操作

    tell application "Terminal"
       set currentTab to do script ("ssh user@server;")
       delay 6
       do script ("do something remote") in currentTab
    end tell
    

    【讨论】:

    • 这些会等待完成吗?我的意思是do script什么时候回来?
    【解决方案2】:

    正如 EvanK 所说,每个 do 脚本行都会打开一个新窗口,但是您可以运行
    两个具有相同 do 脚本的命令,方法是用分号分隔它们。例如:

    tell application "Terminal"
        do script "date;time"
    end tell
    

    但限制似乎是两个命令。

    但是,您可以将“in window 1”附加到 do 脚本命令(对于第一个之后的每个 do 脚本)以获得相同的效果并继续在同一窗口中运行所需数量的命令:

    tell application "Terminal"
        do script "date"
        do script "time" in window 1
        do script "who" in window 1
    end tell
    


    请注意,我只是以 who、date 和 time 命令为例...替换 使用您需要的任何命令。

    【讨论】:

    • “但限制似乎是两个命令。”一点也不。您可以提供尽可能多的 shell 接受的命令,这仅受行总长度的限制,而不是命令的数量。
    【解决方案3】:

    这是另一种方式,但优点是它启动终端,将其带到前面,并且只创建一个窗口。

    当我想整齐地呈现我的脚本结果时,我喜欢这样。

    tell application "Terminal"
        activate
        set shell to do script "echo 1" in window 1
        do script "echo 2" in shell
        do script "echo 3" in shell
    end tell
    

    【讨论】:

      【解决方案4】:

      这个怎么样?不需要关键代码(至少在 Lion 中,之前不确定),并且子例程简化了主脚本。

      以下脚本将以用户“me”的身份ssh到localhost,延迟1秒后输入密码“myPassw0rd”,发出ls,延迟2秒,然后退出。

      tell application "Terminal"
          activate
          my execCmd("ssh me@localhost", 1)
          my execCmd("myPassw0rd", 0)
          my execCmd("ls", 2)
          my execCmd("exit", 0)
      end tell
      on execCmd(cmd, pause)
          tell application "System Events"
              tell application process "Terminal"
                  set frontmost to true
                  keystroke cmd
                  keystroke return
              end tell
          end tell
          delay pause
      end execCmd
      

      【讨论】:

      • 如何调用我的 execCmd(passwd, 0) ,其中 passwd 是之前设置的变量?将 passwd 设置为“myPassw0rd”?
      【解决方案5】:

      您无需“告诉”终端执行任何操作。 AppleScript 可以直接做 shell 脚本。

      set theDir to "~/Desktop/"
      do shell script "touch " & theDir &"SomeFile.txt"
      

      或其他任何...

      【讨论】:

      • 这种方法是否也只在一个窗口中运行所有内容,还是会为每个“执行命令”打开一个新的终端实例?
      【解决方案6】:

      为什么不用expect:

      tell application "Terminal"
          activate
          set currentTab to do script ("expect -c 'spawn ssh user@IP; expect \"*?assword:*\"; send \"MySecretPass
      \"; interact'")
      end tell
      

      【讨论】:

        【解决方案7】:

        您的问题具体是关于如何让 Applescript 做什么 你要。但是,对于所描述的特定示例,您可能想要 将“期望”视为解决方案。

        【讨论】:

          【解决方案8】:

          有点相关,你可能想看看 Shuttle (http://fitztrev.github.io/shuttle/),它是 OSX 的 SSH 快捷菜单。

          【讨论】:

            【解决方案9】:

            最后一个示例在 10.6.8 (Build 10K549) 下出现由关键字“pause”引起的错误。

            用“等待”这个词代替它可以工作:

            tell application "Terminal"
                activate
                my execCmd("ssh me@localhost", 1)
                my execCmd("myPassw0rd", 0)
                my execCmd("ls", 2)
                my execCmd("exit", 0)
            end tell
            
            on execCmd(cmd, wait)
                tell application "System Events"
                   tell application process "Terminal"
                      set frontmost to true
                      keystroke cmd
                      keystroke return
                   end tell
                end tell
            
                delay wait
            end execCmd
            

            【讨论】:

            • 在激活后添加延迟 3 改进了脚本在 yosemite 中的运行。
            【解决方案10】:

            我可能弄错了,但我认为 Applescript 终端集成是一次性交易...也就是说,每个 do script 调用就像打开一个不同的终端窗口,所以我认为您无法与之交互完全没有。

            您可以复制 SSH 公钥以防止密码提示,然后执行所有连接在一起的命令(警告:以下内容完全未经测试):

            tell application "Terminal"
                activate
                do script "ssh jdoe@example.com '/home/jdoe/dosomestuff.sh && /home/jdoe/dosomemorestuff.sh'"
            end tell
            

            或者,您可以使用Expect 将 ssh 和后续命令包装在一个 shell 脚本中,然后从您的 Applescript 调用该 shell 脚本。

            【讨论】:

            • 您可以通过使用多个“执行脚本”将一系列命令发送到一个终端外壳。追加“在窗口 0”,他们使用我相信的最前面的窗口。
            • 不,似乎 do script 实际上会尝试执行一个脚本(如您所料),这在某种程度上不同于将字符串发送到终端并按回车键,因为它没有就像我刚刚输入密码一样工作。
            • do shell script ssh user:password@server.com 怎样避免密码提示。
            • “……似乎 do script 实际上尝试执行一个脚本(如您所料),这在某种程度上不同于将字符串发送到终端并按回车键……”不,基本上是就好像您输入了它……或者更准确地说,就好像您粘贴了文本一样。您可能会遇到提示输入密码刷新输入的问题,因此您需要等待提示出现后再发送密码。但是,正如其他人所指出的,不要发送您的密码,只需安排自动身份验证即可。
            【解决方案11】:

            设置无密码ssh(ssh-keygen,然后将密钥添加到服务器上的~/.ssh/authorized_keys)。在~/.ssh/config(在您的桌面上)中创建一个条目,这样当您运行 ssh mysqlserver 时,它会转到 user@hostname... 或者创建一个 shell 别名,如 gotosql,扩展为 ssh user@host -t 'mysql_client ...' 以启动 mysql 客户端在服务器上交互。

            那你可能确实需要其他人的答案来编写之后的过程,因为我不知道如何为 mysql 设置启动命令。

            至少这样可以让你的 ssh 密码不被脚本使用!

            【讨论】:

            • 好的,谢谢。但是密码只是一个例子,这里的重点是我想向终端发送几个字符串,无论它们是密码,mysql命令还是其他。
            • 是的,我明白了。但是我们的系统管理员讨厌人们将他们的密码放入纯文本文件中。
            • :) 好的,谢谢您的建议。但我是我电脑中唯一的用户,此外,我用来登录 ssh 服务器的用户名和密码是由世界各地的许多员工共享的,因此对公司来说安全性似乎不是问题.
            • /facepalm.你是唯一的用户并不重要。文件权限可以抵御同一台机器上的其他用户。值得关注的是进入您帐户的病毒和其他攻击媒介。如果 pwning 你的机器可以直接访问更有价值的服务器,那是一件坏事。
            • 是的,对不起,我被系统管理员的咆哮冲昏了头脑。我的回答一开始是对仅使用 ssh 功能来做你想做的事情的替代方法的建议,但后来我意识到你需要在远程端做一堆交互式的东西,所以它最终没有像我一样有用希望,然后我开始咆哮。我使用过 OS X,并且在 Linux 上使用 mrxvt 编写了终端会话脚本,但我没有编写 OS X 终端的脚本。对不起,我是个混蛋。 :(
            【解决方案12】:

            佩特鲁萨,

            不要使用按键,而是使用键码。
            以下示例应该适合您。

            tell application "System Events"
                tell application process "Terminal"
                    set frontmost to true
                    key code {2, 0, 17, 14}
                    keystroke return
                end tell
            end tell
            

            上面的例子将发送字符 {d a t e} 到终端,然后
            按键返回将进入并运行 命令。将上面的示例
            与您需要的任何关键代码一起使用 并且您将能够做您想做的事情。

            【讨论】:

              【解决方案13】:

              这样的事情怎么样:

              tell application "Terminal"
              
                  activate
                  do shell script "sudo dscl localhost -create /Local/Default/Hosts/cc.josmoe.com IPAddress 127.0.0.1"
                  do shell script "sudo dscl localhost -create /Local/Default/Hosts/cc.josmos2.com IPAddress 127.0.0.1"
              
              end tell
              

              【讨论】:

                【解决方案14】:

                作为简洁的解决方案,尝试-

                $ open -a /Applications/Utilities/Terminal.app  *.py
                

                $ open -b com.apple.terminal *.py
                

                对于启动的shell,你可以去Preferences > Shell > 设置它在没有错误的情况下退出。

                就是这样。

                【讨论】:

                  【解决方案15】:

                  我构建了这个脚本。它在 Yosemite 中,它是使用 AppleScript 为 SSH 服务器选择用户列表的 bash 脚本。基本上,您定义一个 IP,然后是用户名。当应用程序启动时,它会询问您要以谁的身份登录。SSH 终端启动并登录,提示输入密码...

                  (***
                   * --- --- --- --- ---
                   * JD Sports Fashion plc
                   * Apple Script
                   * Khaleel Mughal
                   * --- --- --- --- ---
                   * #SHELLSTAGINGSSHBASH
                   * --- --- --- --- ---
                  ***)
                  
                  set stagingIP to "192.162.999.999"
                  
                  set faciaName to (choose from list {"admin", "marketing", "photography_cdn"})
                  
                  if faciaName is false then
                      display dialog "No facia was selected." with icon stop buttons {"Exit"} default button {"Exit"}
                  else
                      set faciaName to (item 1 of faciaName)
                  
                      tell application "Terminal"
                          activate
                          do script "ssh " & faciaName & "@" & stagingIP & ""
                      end tell
                  
                  end if
                  

                  我强烈推荐; Nathan Pickmans post above 关于 Shuttle (http://fitztrev.github.io/shuttle/).. 一个非常智能和简单的应用程序。

                  【讨论】:

                    猜你喜欢
                    • 2011-07-28
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-07-30
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多