4

複数の異なるリモートRedHatマシンで実行されるWebサービスがあります。サービスを更新したいときはいつでも、バージョン管理デポ(私はperforceを使用)からperlで記述された新しいWebサービスソースコードを同期し、その新しい同期されたperlコードを使用してサービスを再起動します。リモートマシンに1つずつログインし、その一連のコマンドを実行してサービスを1つずつ手動で再起動するのは退屈すぎると思います。そこで、「一度一箇所で、すべてのマシンを更新する」ために、以下のようなbashスクリプトupdate.shを作成しました。このシェルスクリプトをローカルマシンで実行します。しかし、それは機能しないようです。ローカルマシンのコマンドラインからわかるように、最初のコマンド「sudo-uwebservice_username-i」のみを実行します。(以下のコードは、リモートWebサービスの1つを更新する方法のみを示しています。 "

#!/bin/sh
    ssh myname@remotehost1 'sudo -u webservice_username -i ; export P4USER=myname; cd dir ; p4 sync ; cd bin ; ./prog --domain=config_file restart ; tail -f ../logs/service.log'

最初のコマンドだけが実行されることがわかっているのはなぜですか?ローカルマシンでsshのパスワードを入力すると、次のように表示されます。

Your environment has been modified. Please check /tmp/webservice.env.

そして、それはただそこで立ち往生しています。私はノーリターンを意味します。

コメント投稿者が提案したように、sshに「-t」を追加しました

#!/bin/sh
        ssh -t myname@remotehost1 'sudo -u webservice_username -i ; export P4USER=myname; cd dir ; p4 sync ; cd bin ; ./prog --domain=config_file restart ; tail -f ../logs/service.log'

これにより、ローカルコマンドラインが返されます。しかし、奇妙に思えます。その「dir」にcdできず、「cd:dir:そのようなファイルまたはディレクトリはありません」と表示されます。「p4:コマンドが見つかりません」とも表示されます。したがって、sudo -uコマンドは効果なしで実行され、exportコマンドは効果なしで実行または実行されていないように見えます。
詳細なローカルログファイルは次のとおりです。

Your environment has been modified. Please check /tmp/dir/.env.
bash: line 0: cd: dir: No such file or directory
bash: p4: command not found
bash: line 0: cd: bin: No such file or directory
bash: ./prog: No such file or directory
tail: cannot open `../logs/service.log' for reading: No such file or directory
tail: no files remaining
4

3 に答える 3

3

ssh経由で接続してすぐにユーザーを変更する代わりに、最初に目的のユーザー名で接続するようなものを使用することはできませんssh -t webservice_username@remotehost1か?そうすれば、sudo完全に必要になることはありません。

それが不可能な場合は、実行するすべてのコマンドをシェルスクリプトにまとめて、リモートマシンに保存してみてください。スクリプトからタスクを機能させることができれば、ssh呼び出しははるかに簡単になり、発生する問題は少なくなります。

ssh myname@remotehost1 '/path/to/script'

このスクリプトを簡単に更新するために、を介して最新バージョンをアップロードし、それを呼び出すためにscp使用するローカルマシン用の短いスクリプトを作成できます。ssh

于 2012-06-13T18:46:55.810 に答える
0

実行するときは次の点に注意してください。

#!/bin/sh
    ssh myname@remotehost1 'sudo -u webservice_username -i ; export P4USER=myname; cd dir ; p4 sync ; cd bin ; ./prog --domain=config_file restart ; tail -f ../logs/service.log'

ssh セッションの実行はsudo -u webservice_username -i、終了するのを待ってから、残りのコマンドを実行します。実行せずsudo、次のコマンドを実行します。これは、一連のコマンドを実行しているコンテキストに関係しています。すべてのコマンドはのシェルで実行され、myname@remotehost1すべてsudo -u webservice_username - iが webservice_username のシェルを開始し、実際にはコマンドを実行しません。

ここで本当に最善の解決策は、btaが言ったようです。スクリプトを作成し、それを宛先に rsync/scp してから、 を使用して実行しsudoます。

于 2012-06-13T19:07:32.563 に答える
0

export コマンドは単にこのように ssh で動作しません。あなたがしたいことはリモート変更 ~/.bashrc であり、ssh ログインを行うたびにそれ自体をソースします。

于 2013-04-04T04:29:25.143 に答える