私は次のような 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 に特定のシェルを使用するように指示し、ユーザー プロファイルまたはログイン ファイルを読み取らないようにする方法があるかどうかです。
答え1
可能であれば、アプリケーションで 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
(これは、対話型非ログイン シェルによってロードされるファイルでもあります)。これを に入れて、csh をエミュレートする関数を.bashrc
定義できます。setenv
if [[ $- != *i* ]]; then
# Non-interactive shell
setenv () {
export "$1=$2"
}
return
fi
答え2
すべてのコマンドを-c
オプションの引数として渡すことができます。
試す:
rsh MACHINE csh -c '<your command>'
答え3
簡単な答え: いいえ、 に含まれるものをスキップすることはできません。/etc/profile
で指定されているシェルは/etc/passwd
神聖です。
誰かがシェルとパスワードなしでシステム アカウントを使用してログインしようとしたらどうなるか想像してみてください/bin/nologin
。rshd (または他のプログラム) がこのような基本的なセキュリティを無視できるようになれば、大変なことになります。
ユーザーのシェル (それが何であれ) を経由して、そこからコマンドを実行する必要があります。コマンドが 1 つの場合は、rsh にその作業を実行させます。
rsh -l remoteuser host.example.com "mkdir testdir"
ソース:ウィキペディア
rsh の安全性のなさはご存知だと思いますが、ssh を使用する方がよいと思います。特に自動化されたプロセスでは、公開鍵認証を利用できるため、パスワードを無効にしたり、暗号化されていないパスワードをプログラムに保存したりする必要はありません。プログラムを rsh にリンクすることもできます。libssh2