Vou enviar uma string de uma máquina local para um servidor ssh remoto.
O usuário está em uma prisão simples, então ele não pode executar comandos, fazer login, fazer algo no bash remoto ou qualquer outra coisa, ele só pode enviar uma string/valor/variável e executar o script run
no servidor ssh não mais.
Esta é a prisão simples para o usuário
Estas são as configurações padrão para o USUÁRIO fazer login e executar um shell:
chsh -s /bin/bash [USER]
Mas eu mudo as configurações para isso para a prisão simples:
chsh -s /home/[USER]/./run [USER]
O servidor ssh recebe a string e altera a string para um novo resultado.
Eu salvo esse novo resultado na minha máquina local em um arquivo chamado OUTPUT
.
Depois de tentar encontrei esta solução, chame-a de hack ou bug, mas não sei se esta é a maneira correta!
- Com este comando eu ssh para o servidor remoto, com uma chave ssh sem senha.
MEU COMANDO SSH NA MÁQUINA LOCAL PARA CONECTAR AO SERVIDOR:
ssh -i [KEY] -p [XXXX] [USER]@[HOST] '123' <<< "$VALUE" > OUTPUT
- O script
run
recebe a string123
da variável$VALUE
MEU SCRIPT COM NOME run
NO SERVIDOR SSH
#!/bin/bash
echo "WELCOME TO SSH"
read VALUE
echo $VALUE
Este é apenas um exemplo para ver o que quero dizer, o Script real gera um Hash.
- Na minha máquina local eu armazeno/salvo o resultado no meu arquivo
OUTPUT
do scriptrun
do servidor ssh remoto.
MEU ARQUIVO LOCAL OUTPUT
COM O RESULTADO DO SERVIDOR
WELCOME TO SSH
123
O read VALUE
comando salva o valor 123
na variável $VALUE
sem prompt e salva o resultado na minha máquina local.
OS PASSOS DE EXECUÇÃO:
- Conecte-se ao servidor ssh
- Envie uma string da minha máquina local para o servidor ssh remoto
- O servidor remoto altera esta string para um novo resultado
- Salve o novo resultado na minha máquina local em um arquivo
Quando eu inicio o comando ssh ele abre a conexão,
o script funciona, eu vejo WELCOME TO SSH
no meu terminal e
recebo o resultado na minha máquina local e a conexão fecha.
Você pode testar facilmente este exemplo em sua máquina para ver o que quero dizer.
Isso é exatamente o que eu preciso, mas eu me pergunto:
Por que eu preciso doread
Por que eu não recebo um prompt.
Qual é uma outra solução para este exemplo.
Como posso enviar uma string para um script em um servidor por ssh com um usuário preso e salvar o resultado do servidor na minha máquina local em um arquivo?
ATUALIZAÇÃO PARA SOLUÇÃO
Da resposta do @ilkkachu, posso executar esses comandos e enviar:
String e Variável:
ssh -i [KEY] -p [XXXX] [USER]@[HOST] "123" "$VALUE" > OUTPUT
Corda:
ssh -i [KEY] -p [XXXX] [USER]@[HOST] "123"> OUTPUT
Variável:
ssh -i [KEY] -p [XXXX] [USER]@[HOST] "$VALUE" > OUTPUT
Nada:
ssh -i [KEY] -p [XXXX] [USER]@[HOST] > OUTPUT
#!/bin/bash
value= # empty by default
if [ "$1" = -c ]; then
value="$2"
fi
if [ -z "$value" ]; then
echo "value is empty" >&2
exit 1
fi
# do something with the value
echo "$value" | rev
Opção de comando SSH authorized_keys
A partir desta postagem:
Opção de comando SSH authorized_keys: vários comandos?
Não. Não é um comando "permitido", mas um comando "forçado" (como opção ForceCommand). A única possibilidade é usar chaves diferentes para comandos diferentes ou ler parâmetros de stdin.
É uma boa dica, mas para um único comando, como um backup ou saída de algumas informações.
Eu tenho que fazer mais coisas de configuração se eu executar um comando como rsync
, se eu não quiser receber erros.
Então vou ficar com um usuário preso simples e um determinado script.
Usar
ssh user@somehost <<< "$value"
é praticamente o mesmo queecho "$value" | ssh user@somehost
: o conteúdo da variável é enviado para a entrada padrão do processo cliente SSH. O SSH transfere isso para a extremidade remota e fica disponível lá para o processo remoto ler, novamente em stdin. Por exemplo, usando o shell'sread
, como você fez lá. Essa é uma maneira de passar dados pela conexão SSH.Outra maneira é usar argumentos de linha de comando. Se você correr
então o SSH pede ao lado remoto para executar o shell do usuário remoto com os dois argumentos
-c
esome string here
. Com um shell normal , isso faria com que o shell interpretasse "alguma string aqui" como uma linha de comando do shell, então, de fato, algo comossh user@somehost "ls /tmp"
funcionaria para executarls
. (ssh user@somehost ls /tmp
faz o mesmo, o cliente SSH junta os argumentos com espaços antes de enviá-los para o controle remoto.)Mas você alterou o shell do usuário para limitar o que ele pode fazer, portanto, a
-c
opção não fará o que o SSH assume. Pela mesma razão, não há prompt: seu script não imprime um como um shell normal faria.No entanto, ter o script como shell não importa, pois ele pode apenas detectar e ignorar a
-c
opção e usar o que vier depois.Por exemplo, você poderia ter um script como este no controle remoto:
O exemplo simulado passaria o valor por
rev
, invertendo a string.Portanto, a execução
ssh user@somehost "hello there"
devolveria a stringereht olleh
.Executar apenas
ssh user@somehost
, sem um "comando" no final, acionaria a mensagem de erro no script, mas também faria o SSH agir como se estivesse iniciando uma sessão interativa. Ele reservaria o pseudo-terminal (pty) no remoto e poderia executar algumas coisas extras geralmente feitas durante o login, como executar módulos de sessão PAM no Linux. Esses fazem coisas como imprimir a "Mensagem do dia" ou verificar se a conta tinha e-mail não lido. O mesmo comssh user@somehost ""
, então você não pode realmente passar um argumento vazio e esperar que ele se comporte exatamente da mesma forma que um não vazio.Além de restringir o shell do usuário remoto, outra alternativa para bloquear os comandos que podem ser executados por meio do SSH seria usar as chaves SSH e usar o
command=...
inauthorized_keys
. Fazer isso também permitiria desabilitar a alocação de pty com a palavra-no-pty
chave. (E o simples fato de executar um comando forçado relacionado à chave pode afetar a execução desses módulos de sessão PAM.) Consulte a página man sshd .Acho que você está se confundindo.
O que você estava perguntando originalmente
: Quando você tem um valor local (por exemplo
VALUE="XXXXXXXX"
, na máquina local), você pode salvá-lo em um arquivo localOUTPUT
sem ir para a máquina remota.O que você realmente quer perguntar:
Possibilidade 1 : Acho que você quer um valor remoto (por exemplo
VALUE="XXXXXXXX"
, na máquina remota), que deseja salvar em um arquivo localOUTPUT
.Solução 1 :
Nota: Aspas simples, não aspas duplas!
Aqui, as aspas simples garantem que
VALUE
não seja avaliada na máquina local, mas será avaliada na máquina remota.O que você realmente quer perguntar:
Possibilidade 2 : "Quero enviar um valor VALUE para um script em execução na máquina remota que produzirá algum novo valor; Eu quero esse novo valor no arquivo local OUTPUT"
Solução 2 :
Nota: Aspas duplas, não aspas simples!
Aqui estamos passando o VALOR para seu script por meio de argumentos de linha de comando. Em /path/to/myscript , você pode acessar esse valor via $1, Ex:
O que você realmente quer perguntar:
Possibilidade 3 : "Tenho uma máquina remota onde o USUÁRIO só pode fazer login, executar um script pré-definido (
/home/[USER]/./run
) e sair. Quero enviar um valor VALUE para esse script em execução na máquina remota que produzirá algum novo valor; eu quero esse novo valor no arquivo local OUTPUT"Solução 3 :
Nota: Aspas duplas, não aspas simples!
Aqui estamos passando a string "MYVALUE" e o valor da variável VALUE para seu script por meio de argumentos de linha de comando. Em seu Script
/home/[USER]/./run
, você pode acessar esses valores de parâmetro de linha de comando por meio de $1, $2, $2, etc. :Aqui estou ecoando todos os valores de parâmetro de linha de comando $ 1, $ 2, $ 3, $ 4, $ 5, $ 6, $ 7, $ 8, $ 9, para verificar qual tem a STRING MYVALUE e qual tem o valor da variável VALUE.
Quando você descobrir que, por exemplo, $3 tem o valor correto, remova todas as
echo
linhas indesejadas, descomente as últimas 3 linhas , atualize o N & M e verifique ; Deve funcionar!