Estou trabalhando com um aplicativo c++ que dispara um comando do sistema que inicia uma sequência RSH, como:
rsh MACHINE \"setenv DISPLAY machine:0;setenv TESTVALUE1 'test';setenv scenTime 0;setenv simName 'name';/devel/test/run.sh\"
O problema é que esse código é csh
específico e meu shell é bash
. Portanto, comandos como setenv variable value
need to be export variable=value
etc.
Minha pergunta é: existe uma maneira de o rsh ser instruído a usar um shell específico e não ler o perfil do usuário ou os arquivos de login?
Responder1
Se puder, faça com que o aplicativo use a sintaxe sh em vez da sintaxe csh. O Csh é usado por poucas pessoas neste século e muitas vezes não é instalado por padrão. Sh é o padrão. Na verdade, para um comando tão simples você nem precisa se preocupar com o shell: basta chamar o env
programa.
rsh MACHINE "env DISPLAY=machine:0 TESTVALUE1='test' scenTime=0 simName='name' /devel/test/run.sh"
Se você não pode alterar o aplicativo, mas seu shell é bash, você pode usar uma peculiaridade do bash: quando é um shell de login não interativo e quando seu processo pai é rshd
or sshd
, o bash é executado ~/.bashrc
(que também é o arquivo carregado pelo interativo shells sem login). Você poderia colocar isso .bashrc
para definir uma setenv
função para emular csh:
if [[ $- != *i* ]]; then
# Non-interactive shell
setenv () {
export "$1=$2"
}
return
fi
Responder2
Você pode passar todos os seus comandos como argumento para -c
a opção.
Tentar:
rsh MACHINE csh -c '<your command>'
Responder3
Resposta simples: não, você não pode pular o que está dentro /etc/profile
e o shell especificado /etc/passwd
é sagrado.
Imagine o que aconteceria se alguém tentasse fazer login usando uma conta de sistema com shell /bin/nologin
e sem senha. Seria um desastre se o rshd (ou qualquer outro programa) pudesse ignorar essa segurança básica.
Você tem que passar pelo shell do usuário (seja ele qual for) e executar seu comando a partir daí. Se for um único comando: peça ao rsh para fazer exatamente isso por você.
rsh -l remoteuser host.example.com "mkdir testdir"
Fonte:Wikipédia
Presumo que você conheça as inseguranças do rsh e que é melhor usar o ssh. Principalmente em processos automatizados, pois você pode fazer uso da autenticação de chave pública. (Assim você não precisa desabilitar nenhuma senha ou armazenar uma senha não criptografada em seu programa.) Você pode até tentar vincular seu programa alibssh2