Eu escrevi um script que funciona bem quando executado localmente:
./sysMole -time Aug 18 18
Os argumentos "-time" , "Aug" , "18" e "18" são transmitidos com êxito para o script.
Agora, esse script foi projetado para ser executado em uma máquina remota, mas a partir de um diretório local na máquina local. Exemplo:
ssh root@remoteServer "bash -s" < /var/www/html/ops1/sysMole
Isso também funciona bem. Mas o problema surge quando tento incluir os argumentos acima mencionados (em 18 de agosto de 18) , por exemplo:
ssh root@remoteServer "bash -s" < /var/www/html/ops1/sysMole -time Aug 18 18
Depois de executar esse script, recebo o seguinte erro:
bash: cannot set terminal process group (-1): Invalid argument
bash: no job control in this shell
Por favor, diga-me o que estou fazendo de errado, isso é muito frustrante.
Respostas:
Você estava bem próximo do seu exemplo. Funciona muito bem quando você o usa com argumentos como esses.
Exemplo de script:
Exemplo que funciona:
Mas falha nesses tipos de argumentos:
O que está acontecendo?
O problema que você está enfrentando é que o argumento,
-time
ou--time
no meu exemplo, está sendo interpretado como uma opção parabash -s
. Você pode pacificarbash
encerrando-o de usar qualquer um dos argumentos restantes da linha de comando usando o--
argumentoComo isso:
Exemplos
# 1:
# 2:
# 3:
# 4:
NOTA: Apenas para deixar claro que onde quer que o redirecionamento apareça na linha de comando não faça diferença, porque
ssh
chama um shell remoto com a concatenação de seus argumentos de qualquer maneira, a citação não faz muita diferença, exceto quando você precisa citar no shell remoto como no exemplo 4:fonte
bash -s -- --time bye < ./ex.bash
ou mesmo< ./ex.bash bash -s -- --time bye
. isso ocorre porque o shell primeiro pega a instrução de redirecionamento (independentemente de onde esteja no comando), depois configura o redirecionamento e depois executa o restante da linha de comando com o redirecionamento no lugar.Como lidar com argumentos arbitrários
Se você estiver realmente usando apenas uma única string, por exemplo.
-time Aug 18 18
, você pode simplesmente codificá-lo, e as respostas existentes mostram como fazer isso adequadamente. Por outro lado, se você precisar passar argumentos desconhecidos (como uma mensagem a ser exibida no outro sistema ou o nome de um arquivo criado onde os usuários finais poderiam controlar seu nome), serão necessários mais cuidados.Com
bash
ouksh
como/bin/sh
Se o seu controle remoto
/bin/sh
for fornecido por bash ou ksh, você poderá fazer o seguinte com segurança com uma lista de argumentos não confiáveis, de modo que até nomes maliciosos (como$(rm -rf $HOME).txt
) possam ser transmitidos como argumentos com segurança:Com qualquer compatível com POSIX
/bin/sh
Para estar seguro contra dados de argumento suficientemente mal-intencionados (tentando tirar proveito da citação não compatível com POSIX usada por
printf %q
no bash quando caracteres não imprimíveis estão presentes na cadeia que está sendo escapada) mesmo com um/bin/sh
que seja POSIX de linha de base (comodash
ouash
), ele fica um pouco mais interessante:Uso (para qualquer um dos itens acima)
As funções fornecidas acima podem ser chamadas como:
...ou...
fonte
diga aa é um arquivo local que contém ls
$ssh servername "cat | bash" < a.a
mude 127.0.0.1 para o seu ip remoto
esses dois transmitem uma mensagem sobre alocação de pseudo-tty mas eles funcionam.
$ cat a.a | ssh 127.0.0.1
$ ssh 127.0.0.1 <a.a
Ou
$ cat a.a | ssh 127.0.0.1 bash or
$ ssh 127.0.0.1 bash < a.a
fonte