次のようなRSHシーケンスを起動するシステムコマンドを起動するc ++アプリケーションを使用しています。
rsh MACHINE \"setenv DISPLAY machine:0;setenv TESTVALUE1 'test';setenv scenTime 0;setenv simName 'name';/devel/test/run.sh\"
問題は、このコードがcsh
固有であり、私のシェルがbash
であるということです。したがって、setenv variable value
などのコマンドはexport variable=value
などである必要があります。
私の質問は、rshに特定のシェルを使用し、ユーザープロファイルやログインファイルを読み取らないように指示する方法はありますか?
可能であれば、アプリケーションでcsh構文ではなくsh構文を使用するようにします。 Cshは今世紀にごく少数の人々によって使用され、デフォルトでインストールされないことがよくあります。 Shが標準です。実際、このような単純なコマンドの場合、シェルを気にする必要はありません。env
プログラムを呼び出すだけです。
rsh MACHINE "env DISPLAY=machine:0 TESTVALUE1='test' scenTime=0 simName='name' /devel/test/run.sh"
アプリケーションを変更できないが、シェルがbashである場合は、bashの癖を使用できます。これは、非対話型ログインシェルであり、その親プロセスがrshd
またはsshd
の場合です。 、bashは~/.bashrc
を実行します(これは、対話型の非ログインシェルによってロードされるファイルでもあります)。これを.bashrc
に入れて、cshをエミュレートするsetenv
関数を定義できます。
if [[ $- != *i* ]]; then
# Non-interactive Shell
setenv () {
export "$1=$2"
}
return
fi
すべてのコマンドを引数として-c
オプションに渡すことができます。
試してみてください:
rsh MACHINE csh -c '<your command>'
簡単な答え:いいえ、/etc/profile
にあるものをスキップすることはできず、/etc/passwd
で指定されているシェルは神聖です。
誰かがShell/bin/nologin
を使用し、パスワードなしでシステムアカウントを使用してログインしようとすると、どうなるか想像してみてください。 rshd(または他のプログラム)がそのような基本的なセキュリティを無効にすることを許可された場合、それは惨事になります。
ユーザーのシェル(それが何であれ)を通過し、そこからコマンドを実行する必要があります。単一のコマンドの場合:rshにそれを実行するように依頼します。
rsh -l remoteuser Host.example.com "mkdir testdir"
出典: ウィキペディア
Rshの不安定さをご存知であり、sshを使用する方がよいと思います。特に自動化されたプロセスでは、公開鍵認証を利用できるためです。 (したがって、パスワードを無効にしたり、暗号化されていないパスワードをプログラムに保存したりする必要はありません。)プログラムを libssh2 に対してリンクすることもできます。