我正在使用一个 C++ 应用程序,它会触发一个启动 RSH 序列的系统命令,例如:
rsh MACHINE \"setenv DISPLAY machine:0;setenv TESTVALUE1 'test';setenv scenTime 0;setenv simName 'name';/devel/test/run.sh\"
问题是这段代码是csh
特定的,而我的 shell 是bash
.因此,诸如setenv variable value
need beexport variable=value
等命令。
我的问题是有没有办法让 rsh 使用特定的 shell 而不是读取用户配置文件或登录文件?
答案1
如果可以,请让应用程序使用 sh 语法而不是 csh 语法。本世纪很少有人使用 Csh,并且通常不会默认安装。 Sh是标准。事实上,对于这样一个简单的命令,您甚至不需要关心 shell:您只需调用该env
程序即可。
rsh MACHINE "env DISPLAY=machine:0 TESTVALUE1='test' scenTime=0 simName='name' /devel/test/run.sh"
如果您无法更改应用程序,但您的 shell 是 bash,则可以使用 bash 的一个特性:当它是非交互式登录 shell 且其父进程是rshd
或时sshd
,bash 将运行~/.bashrc
(这也是交互式登录 shell 加载的文件)非登录 shell)。您可以将其放入.bashrc
定义一个setenv
模拟 csh 的函数中:
if [[ $- != *i* ]]; then
# Non-interactive shell
setenv () {
export "$1=$2"
}
return
fi
答案2
您可以将所有命令作为参数传递给-c
选项。
尝试:
rsh MACHINE csh -c '<your command>'
答案3
简单的答案:不,你不能跳过其中的内容/etc/profile
,并且指定的 shell/etc/passwd
是神圣的。
/bin/nologin
想象一下,如果有人尝试使用带有 shell且没有密码的系统帐户登录,会发生什么。如果允许 rshd(或任何其他程序)推翻这种基本安全性,那将是一场灾难。
您必须进入您的用户 shell(无论它是什么)并从那里执行您的命令。如果它是单个命令:请让 rsh 为您执行此操作。
rsh -l remoteuser host.example.com "mkdir testdir"
来源:维基百科
我假设您知道 rsh 的不安全性并且最好使用 ssh。特别是在自动化流程中,因为您可以利用公钥身份验证。 (因此您不需要禁用任何密码或在程序中存储未加密的密码。)您甚至可以尝试将您的程序链接到libssh2