2

1 つのマスター シェル スクリプトから 2 つの異なるスクリプトを実行したいと考えています。

  • 最初のものは、次のコマンド「rosh -n -l abcd」を使用します(ユーザーabcdでサーバーにログインし、同じシェルで他のコマンドを実行する必要がscript#2ありscript#3ます...など)

    スクリプト#2-そこから、使用するユーザーを変更しsu - xyz、パスワードを提供する必要があります (ファイルにこれをハードコーディングできれば問題ありません) (スクリプト名は logintoServer です)

    スクリプト#3-同じシェルでいくつかのスクリプトを実行して、サーバーの停止の開始を確認します...

私は次のことをしましたが失敗しました

  • 持っているスクリプトが1つありますrosh -n <servername> -l abcd /bin/sh -c "su - xyz"(同じシェルでこのコマンドを実行する必要があります)

    以下はエラーです。

    1. 「standard in must be a tty」の実行中にエラーが発生します
    2. 2 つの異なるスクリプトを作成して実行しようとしましたが、問題は、最初のスクリプトが実行されると、スクリプトを終了するまで 2 番目のスクリプトが実行されないことです。(最初のスクリプトで作成されたサブシェルから 2 番目のスクリプトを実行する必要があります....)
4

1 に答える 1

0

私は持ってroshおらず、マニュアルページも持っていませんroshが、同様の問題が次の場合に存在しsshます。

ssh localhost /bin/bash -c 'echo x' # (prints nothing)
ssh localhost "/bin/bash -c 'echo x'" # x
ssh localhost "/bin/bash -c 'tty'" # not a tty
ssh -t localhost "/bin/bash -c 'tty'" # /dev/pts/12\nConnection to localhost closed.
ssh localhost "/bin/bash -c 'su - $USER'" # su: must be run from a terminal
ssh -t localhost "/bin/bash -c 'su - $USER'"

最後にパスワードを要求してからシェルをくれたので、それは 3 つのステップのうちの 2 つです。

そのため、1 つのアイデアはrosh-t オプションもあるかどうかを確認することであり、もう 1 つのアイデアは引用符で囲む/bin/bash...ことです (第 3 レベルではエスケープが必要になります)。

rosh同等のコマンドで何が言いますか?

UPDATE 最新の状態:

rosh -n $host -l abcd -t "/bin/sh -c 'su - $user'"

/bin/su - xyz次に、代わりにと言って 1 つの手順を/bin/sh -c 'su - xyz'省略します。その後、後で一重引用符を使用できます。

rosh -n $host -l abcd -t "/bin/su - $user -c 'echo $PATH'"

これにより、echo コマンドで見られるように $PATH が出力されます。どうやらJavaが含まれていないようです。試しman suてくださいwhich java、、man whichsu ... -c cmd/etc/passwd で指定されたシェルで cmd を実行するため</etc/passwd grep $user、リモート マシンでどのシェルが使用されているかを調べます。それがbashの場合、.bashrcなどで$ PATHを変更できます。他のシェルについては、正確にはわかりません。

または、java の起動時に絶対パスを指定します。

パスワードについて:sshを使用して、秘密鍵/公開鍵とssh-agent. それroshもうまくいくかどうかわからないからです。

于 2013-06-04T05:23:20.870 に答える