用Applescript发送命令和string到Terminal.app

我想要做这样的事情:

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

例如login到服务器,input密码,然后login到mysql并select一个数据库。
我每天都要input它,将其绑定到脚本中会非常有帮助。

另外,有什么命令,属性,function等应用程序(terminal,Finder等)可用于Applescript内的参考? 谢谢!

编辑 :让我明白这一点:我不想做几个'做脚本',因为我试过了,不工作。 我想要打开一个terminal窗口,然后模仿一些字符的人类input,然后input。 可能是密码,可能是命令,不pipe怎么说,只是发送字符到正在运行ssh的terminal。 我尝试击键,似乎并没有工作。

15 Solutions collect form web for “用Applescript发送命令和string到Terminal.app”

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

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

正如EvanK所说,每个脚本行都会打开一个新窗口,但是你可以运行
两个命令使用相同的脚本通过用分号分隔它们。 例如:

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

但限制似乎是两个命令。

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

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

请注意,我只是使用who,date和time命令作为示例…用您需要的任何命令进行replace。

这是另一种方式,但是它启动terminal的优点,将它带到最前面,并且只创build一个窗口。

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

 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 

这个怎么样? 关键代码是不需要的(至less在Lion中,前面不太确定),子程序简化了主脚本。

下面的脚本会以用户“me”的身份ssh到localhost,延迟1秒后input密码“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 

你不需要“告诉”terminal做任何事情。 AppleScript可以直接执行shell脚本。

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

pipe他呢 …

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

你的问题是关于如何让Applescript做你想做的。 但是,对于所描述的特定示例,您可能需要考虑“期望”作为解决scheme。

为什么不使用expect:

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

我可能会误解,但我认为Applescript Terminal集成是一次性处理…也就是说,每个do script调用都像是打开一个不同的terminal窗口,所以我认为你根本不可能和它进行交互。

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

 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脚本。

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

那么你可能确实需要别人的回答来编写脚本,因为我不知道如何为mysql设置启动命令。

至less可以让你的ssh密码不在脚本中!

Petruza,

而不是使用按键使用密钥代码。
下面的例子应该适合你。

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

上面的例子将发送字符{date}到terminal,然后
击键返回将进入并运行命令。 使用上面的例子
无论你需要什么键码,你都可以做你想做的事情。

最后一个例子在关键字“pause”导致10.6.8(Build 10K549)下出现错误。

用“等待”这个词来代替它使它起作用:

 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 

那么这样的事情呢?

 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 

作为整洁的解决scheme,

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

要么

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

对于启动的shell,您可以转到首选项> Shell>将其设置为退出,如果没有错误。

而已。

我build立了这个脚本。 这是在优胜美地,它是使用AppleScript bash脚本来selectSSH服务器的用户列表。 基本上,你定义一个IP,然后用户名..当应用程序启动时询问你想login的用户.. SSHterminal启动并login提示密码…

 (*** * --- --- --- --- --- * 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 

我强烈build议尽pipe; Nathan Pickmans在Shuttle 上面发布 ( http://fitztrev.github.io/shuttle/ )..一个非常聪明和简单的应用程序。

  • OS XterminalUTF-8的问题
  • 如何检测sys.stdout是否连接到terminal?
  • CFURLCopyResourcePropertyForKey失败,因为它传递了这个没有scheme的URL:
  • 在Bash脚本中获取当前目录名称(没有完整path)
  • 如何通过Ubuntuterminal编辑/保存文件
  • 如何检测emacs是在terminal模式?
  • 在C / C ++中编写“真正的”交互式terminal程序,如vim,htop,...不带ncurses
  • 重新使用Bash中最后一个命令的输出
  • 未findgcloud命令 - 安装Google Cloud SDK
  • 列出Git别名
  • brew医生说“错误:/ usr / bin出现在/ usr / local / bin之前”如何解决?