web-dev-qa-db-ja.com

Applescriptを使用してコマンドと文字列をTerminal.appに送信する

私はこのようなことをしたい:

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内で使用できるコマンド、プロパティ、関数などのリファレンスはありますか?ありがとう!

[〜#〜] edit [〜#〜]:これをはっきりさせてください:私が試したので動作しないので、いくつかの「スクリプトを実行」したくありません。ターミナルウィンドウを開き、いくつかの文字を入力してEnterキーを押します。パスワードである可能性があり、コマンドである可能性があります。たまたまsshを実行している端末に文字を送信するだけです。キーストロークを試しましたが、動作しないようです。

49
Petruza

最初にサーバーに接続し、6秒待機し(変更可能)、同じタブを使用してリモートサーバーで必要なものを実行します。

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

EvanKが述べたように、各doスクリプト行は新しいウィンドウを開きますが、実行することはできます
同じdoスクリプトを持つ2つのコマンドをセミコロンで区切って指定します。例えば:

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

しかし、制限は2つのコマンドのようです。

ただし、do scriptコマンドに「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コマンドを例として使用したことに注意してください。必要なコマンドに置き換えてください。

15
user225057

別の方法もありますが、Terminalを起動して前面に表示し、ウィンドウを1つだけ作成するという利点があります。

自分の台本の結果をきちんと提示したいとき、私はこれが好きです。

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
10
Dan

これはどう?キーコードは必要ありません(少なくともLionでは、以前はわかりません)。サブルーチンを使用すると、メインスクリプトが簡単になります。

以下のスクリプトは、ユーザー「me」としてlocalhostにsshし、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
8
Allen Robel

何もするためにターミナルに「伝える」必要はありません。 AppleScriptはシェルスクリプトを直接実行できます。

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

または何でも...

5
user1984702

Expectを使用しない理由:

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

あなたの質問は、具体的にApplescriptにあなたが望むことをさせる方法についてです。ただし、説明されている特定の例では、ソリューションとして「期待」を検討することができます。

2
pizzaFace

ちょっと関連して、あなたはシャトル( http://fitztrev.github.io/shuttle/ )を見たいかもしれません、それはOSXのSSHショートカットメニューです。

2
Nathan Pitman

誤解される可能性がありますが、Applescript Terminalの統合は単発的な取引だと思います...つまり、それぞれdo script呼び出しは、別のターミナルウィンドウを開くようなものなので、操作することはまったくできないと思います。

パスワードのプロンプトを防ぐためにSSH公開キーをコピーしてから、すべてのコマンドを結合して実行できます(警告:以下は完全にテストされていません):

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

または、 Expect を使用してsshおよび後続のコマンドをシェルスクリプトでラップし、Applescriptからシェルスクリプトを呼び出すこともできます。

1
EvanK

パスワードなしのsshをセットアップします(ssh-keygen、次にサーバー上の~/.ssh/authorized_keysにキーを追加します)。 ~/.ssh/config(デスクトップ上)にエントリを作成し、ssh mysqlserverを実行するとuser @ hostnameに移動するようにします...または、ssh user@Host -t 'mysql_client ...'に展開されるgotosqlなどのシェルエイリアスを作成しますサーバー上で対話的にmysqlクライアントを起動します。

その後、mysqlの起動コマンドを設定する方法がわからないため、その後のプロセスをスクリプト化するために、おそらく誰か他の人の回答が必要になるでしょう。

少なくとも、それはあなたのsshパスワードをスクリプトから締め出します!

1
Peter Cordes

ペトルーザ、

キーストロークを使用する代わりに、キーコードを使用します。
次の例が役立ちます。

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}をターミナルに送信してから、
keystroke returnはコマンドを入力して実行します。上記の例を使用してください
必要なキーコードを使用して、あなたがしようとしていることを実行できるようになります。

1
user225057

最後の例では、キーワード「一時停止」が原因で10.6.8(ビルド10K549)でエラーが発生します。

単語「wait」に置き換えると、機能します。

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
1
user1019711

このようなものはどうですか:

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
0
joey

きちんとしたソリューションとして、試してください-

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

または

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

起動したシェルの場合、[設定]> [シェル]に移動し、エラーがなければ終了するように設定できます。

それでおしまい。

このスクリプトを作成しました。 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の投稿 シャトルについて( http://fitztrev.github.io/shuttle/ )..非常にスマートでシンプルなアプリケーション。

0
TheBlackBenzKid