頻繁に必要なコマンドを実行するためにシェルスクリプトを作成しようとしています。 SSHログインに公開/秘密鍵のペアを使用してパスワードプロンプトをスキップします。検索を行った後、次のようなコードを実行できました。
ファイル:ssh.sh
ssh -X [email protected] << EOF
cd /root/myDir
gedit a.c b.c
EOF
しかし、次のように書くと何の違いもありません。
ssh -X [email protected] << EOF
cd /root/myDir
gedit a.c b.c &
EOF
他に何もない&
。はい&
、通常はgeditが実行された後にバックグラウンドで送信され、プロンプトが表示されます。しかし、geditの後にプロンプトは表示されません。 (ただし、次の行の内容はすべて実行されます。入力するとすぐにecho "Hello"
表示されますHello
。)
どうなりますか?別の方法がありますか? SSHを実行し、シェルスクリプトを介していくつかのコマンドを実行したいと思います。ただし、シェルスクリプトの実行が完了した後はログアウトしたくありません。上記のスクリプトのように繰り返されないいくつかのコマンドを実行した後、手動でログアウトしたいと思います。
答え1
そうでない場合、リモートで実行されたスクリプトは「に変更してから実行し、終了するのを待ちます」と&
言います。出口を待たないという意味のバリエーションです。どちらの方法でもスクリプトの最後のコマンドを実行した後、シェルは終了します。/root/myDir
gedit
&
gedit
スクリプトを実行してからよりインタラクティブに入力されたコマンドを実行するには、最後にインタラクティブシェルを実行する必要があります。
ssh -Xt [email protected] 'cd /root/myDir && gedit a.c b.c; exec bash'
このオプションは、-t
SSH にサーバーに仮想端末を設定するよう指示します。実行するリモートコマンドを渡すと、デフォルトではこれは行われません。exec bash
最後に、シェルに新しいbashインスタンスに置き換えるように指示します。このインスタンスは入力が端末から来るため、対話型シェル(プロンプトの表示、コマンドの受信など)になります。
答え2
aを定義してfunction
から実行できますssh
。
#!/bin/bash
ssh_func(){
cd /root/myDir
gedit a.c b.c
}
ssh -X [email protected] "$(typeset -f); ssh_func"
typeset -f
スクリプトで定義された機能が表示されます。