2009-12-08 35 views
46

我想要做這樣的事情:發送命令和字符串Terminal.app使用AppleScript

tell application "Terminal" 
    activate 
    do script "ssh [email protected]" 
    -- // write user's password 
    -- // write some linux commands to remote server 
end tell 

例如登錄到服務器,輸入密碼,然後登錄到MySQL和選擇DB 。
我每天都會輸入這個數字,它會是真的有助於將它綁定到腳本中。

此外,有什麼命令,屬性,功能等應用程序(終端,Finder等)可供在Applescript中使用的參考?謝謝!

編輯:讓我明確這一點: 我不想做幾個'做腳本',因爲我試過了,不起作用。 我想打開一個終端窗口,然後模仿人類在某些字符中鍵入並敲擊回車。可能是密碼,可能是命令,不管怎麼說,只是發送字符到正在運行ssh的終端。我嘗試了擊鍵,似乎沒有工作。

回答

48

首先連接到服務器,並等待6秒(可以更改),然後執行不管你使用相同的標籤

需要在遠程服務器上
tell application "Terminal" 
    set currentTab to do script ("ssh [email protected];") 
    delay 6 
    do script ("do something remote") in currentTab 
end tell 
+2

這些會等待完成嗎?我的意思是什麼時候'''做腳本''返回? – 2012-11-07 14:04:57

1

我可能被誤認爲了,但我認爲Applescript終端集成是一次性處理......也就是說,每個do script調用就像打開一個不同的終端窗口,所以我不認爲你可以與它進行交互所有。

你可以通過SSH公鑰複製到防止密碼提示,然後執行的所有命令連接在一起(警告:下面是完全未經測試):

tell application "Terminal" 
    activate 
    do script "ssh [email protected] '/home/jdoe/dosomestuff.sh && /home/jdoe/dosomemorestuff.sh'" 
end tell 

或者,你可以換了ssh和後續命令,使用Expect,然後從你的Applescript中調用所述shell腳本。

+2

只需使用多個「執行腳本」,即可將一系列命令發送到一個終端shell。追加「窗口0」,他們使用我相信的最前面的窗口。 – 2009-12-08 23:07:17

+0

不,看起來腳本實際上試圖執行一個腳本(就像你所期望的那樣),這在某種程度上與將字符串發送到終端並按回車不同,因爲它不起作用,就好像我剛進入密碼。 – Petruza 2009-12-09 14:26:03

+0

怎麼樣'做shell腳本ssh用戶:密碼@ server.com'以避免密碼提示。 「 – stib 2010-01-12 13:38:12

1

設置無密碼ssh(ssh-keygen,然後將密鑰添加到服務器上的~/.ssh/authorized_keys)。在~/.ssh/config(在你的桌面上)輸入一個條目,這樣當你運行ssh mysqlserver時,它會轉到user @ hostname ...或者創建一個shell別名,比如gotosql,擴展到ssh [email protected] -t 'mysql_client ...'以在服務器上交互地啓動mysql客戶端。

然後你可能確實需要別人的回答來編寫腳本,因爲我不知道如何爲mysql設置啓動命令。

至少可以讓您的ssh密碼不在腳本中!

+0

好的謝謝。但密碼只是一個例子,這裏的重點是我想發送幾個字符串到終端,無論它們是密碼,mysql命令還是其他。 – Petruza 2009-12-09 14:16:46

+0

是的,我明白了。但是,當人們將密碼輸入到純文本文件時,我們會系統管理員。 – 2009-12-09 18:39:49

+0

:)好的,謝謝你的建議。但是我是我電腦中的唯一用戶,此外,我用來登錄到ssh服務器的用戶和密碼由全球很多員工共享,所以安全性對公司來說並不是問題。 – Petruza 2009-12-09 18:54:20

13

正如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 


請注意,我只是用誰,日期和時間命令爲例...你所需要的任何命令替換 。

+1

「但限制似乎是兩個命令。「 一點也不。您可以提供儘可能多的命令,因爲shell將接受的命令數量僅受命令行總長度的限制,而不受命令數量的限制。 – 2011-11-03 03:50:55

1

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 

上面的例子將發送字符{D A T E} 到終端,然後
擊鍵返回將進入和運行 該命令。使用上面的示例
以及您需要的任何鍵碼 ,您就可以做你想做的事情。

0

怎麼樣這樣的:

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 
8

這個怎麼樣?不需要關鍵代碼(至少在Lion中,前面不太確定),並且子例程簡化了主腳本。

以下腳本將以用戶「me」的身份ssh到localhost,延遲1秒後輸入密碼「myPassw0rd」,發出ls,延遲2秒,然後退出。

tell application "Terminal" 
    activate 
    my execCmd("ssh [email protected]", 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 
+0

我該如何調用我的execCmd(passwd,0),其中passwd是以前設置的變量?將passwd設置爲「myPassw0rd」? – 2015-01-31 16:23:51

1

最後一個示例在關鍵字「pause」導致10.6.8(Build 10K549)下出現錯誤。

由單詞替換爲「等待」使得它的工作:

tell application "Terminal" 
    activate 
    my execCmd("ssh [email protected]", 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 
2

你的問題具體如何獲得的AppleScript做你想要什麼 。但是,對於所描述的特定示例,您可能希望 將「期望」視爲解決方案。

9

下面是另一種方式,但是它具有啓動終端的優點,將它帶到最前面,並且只創建一個窗口。

我喜歡這個,當我想整齊地呈現我的腳本的結果。

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 
5

你不需要「告訴」終端做任何事情。 AppleScript可以直接執行shell腳本。

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

或其他...

+0

https://developer.apple.com/library/mac/technotes/tn2065/_index.html – bleater 2014-05-22 04:46:05

+0

這種方法是否也只在一個窗口中運行一切,或者是否會爲每個「do命令」打開一個新的Terminal實例? – 2016-05-29 13:11:16

0

整齊的解決方案,試戴

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

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

對於推出的外殼,你可以去首選項>殼牌>設置,如果沒有錯誤退出。

就是這樣。

2

爲什麼不使用期望:

tell application "Terminal" 
    activate 
    set currentTab to do script ("expect -c 'spawn ssh [email protected]; expect \"*?assword:*\"; send \"MySecretPass 
\"; interact'") 
end tell 
0

我建立了這個腳本。它位於優勝美地,它是使用AppleScript的bash腳本爲SSH服務器選擇用戶列表。基本上你定義一個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/)..一個非常聰明和簡單的應用程序。