Я работаю с приложением C++, которое запускает системную команду, запускающую последовательность RSH, например:
rsh MACHINE \"setenv DISPLAY machine:0;setenv TESTVALUE1 'test';setenv scenTime 0;setenv simName 'name';/devel/test/run.sh\"
Проблема в том, что этот код csh
специфичен, а моя оболочка — bash
. Поэтому команды, такие как setenv variable value
need, должны быть export variable=value
и т. д.
У меня вопрос: есть ли способ указать rsh использовать определенную оболочку и не читать профиль пользователя или файлы входа?
решение1
Если можете, заставьте приложение использовать синтаксис sh вместо синтаксиса csh. 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
чтобы определить setenv
функцию для эмуляции csh:
if [[ $- != *i* ]]; then
# Non-interactive shell
setenv () {
export "$1=$2"
}
return
fi
решение2
Вы можете передать все свои команды в качестве аргумента -c
option.
Пытаться:
rsh MACHINE csh -c '<your command>'
решение3
Простой ответ: нет, вы не можете пропустить то, что находится внутри, /etc/profile
и оболочка, указанная внутри, /etc/passwd
является священной.
Представьте, что произойдет, если кто-то попытается войти, используя системную учетную запись с оболочкой /bin/nologin
и без пароля. Это была бы катастрофа, если бы rshd (или любая другая программа) позволили обойти такую базовую безопасность.
Вам нужно пройти через оболочку пользователя (какой бы она ни была) и выполнить команду оттуда. Если это одна команда: попросите rsh сделать это за вас.
rsh -l remoteuser host.example.com "mkdir testdir"
Источник:Википедия
Я предполагаю, что вы знаете о небезопасности rsh и что лучше использовать ssh. Особенно в автоматизированных процессах, потому что вы можете использовать аутентификацию с открытым ключом. (Так что вам не нужно отключать какой-либо пароль или хранить незашифрованный пароль в вашей программе.) Вы даже можете попробовать связать свою программу сlibssh2