Executando um arquivo de script sobre o ssh através do sudo

0

Eu posso fazer login em uma máquina remota como um usuário que pode fazer sudo su - . Não consigo logar como root.

Eu tenho um script localmente que quero executar na máquina remota. Além disso, o script é enviado por outro script.

Eu não consigo descobrir como. Eu tenho um pouco de Q & A aqui, mas não tenho sucesso. O mais perto que eu tenho:

COMMAND_SSH="sudo -i <<\'EOF\'"'cat ./unifyServiceNode.sh'"\nEOF\n" ;;
...
while read HOST; do
  echo -e "\n\n======== $USER_@$HOST <-- $COMMAND_SSH =================\n\n";
  ssh -n -tt centos@$HOST "'$COMMAND_SSH'";
done < hosts.txt

Isso acaba com essa saída:

======== [email protected] <-- sudo -i <<\'EOF\'
##
##  Creates a few links and scripts to unify the nodes maintainance.
##

  BB="/bb"
  NAME="bpds-api"
  NAME2="bpds-"

  mkdir -p $BB
  ln -s /opt/$NAME/logs/*.log $BB/log
  ln -s /opt/$NAME/conf/api/$NAME.yml $BB/conf.yml || ln -s /opt/$NAME/conf/api/$NAME2.yml $BB/conf.yml
  echo "systemctl \${1:-restart} "${@:2}" $NAME" > $BB/Sys
  echo "tail -\${1:-500f} $BB/log" > $BB/Tail
  echo "nano $BB/conf.yml" > $BB/Conf
  chmod a+x $BB/Sys $BB/Tail $BB/Conf
  echo "export PATH=\$PATH:$BB" >> ~/.bashrc
EOF
 =====================================


bash: sudo -i <<\EOF': command not found
bash: line 14: /bb/Sys: Permission denied
bash: line 15: /bb/Tail: Permission denied
bash: line 16: /bb/Conf: Permission denied
chmod: changing permissions of ‘/bb/Sys’: Operation not permitted
chmod: changing permissions of ‘/bb/Tail’: Operation not permitted
chmod: changing permissions of ‘/bb/Conf’: Operation not permitted
bash: -c: line 18: unexpected EOF while looking for matching '''
bash: -c: line 19: syntax error: unexpected end of file
Connection to somehost.com closed.

Este é o "mais próximo" porque ele vê os comandos individuais, mas não está sob sudo , porque a primeira linha ' <<EOF ' não foi (un) apropriadamente.

** Como devo executar um script arbitrário em sudo over ssh ? "

    
por Ondra Žižka 02.03.2018 / 05:28

4 respostas

3

Eu descobri logo após postar.

COMMAND_SSH="sudo -i <<'EOF'"'cat ./unifyServiceNode.sh''echo -e '\nEOF'' ;;

ssh -n -tt centos@$HOST "$COMMAND_SSH"; ## -n prevents reading the input. -tt forces TTY.

O ' s extra em torno do comando SSH foi o problema que parece e também precisei fazer a nova linha por meio de echo .

Eu não tenho certeza se isso é apenas um golpe de sorte ou o caminho certo para fazê-lo, no entanto. Para ser honesto, estou completamente perdido na avaliação das citações de Bash:)

    
por 02.03.2018 / 05:35
0

Coloque os comandos que você precisa para executar em um script, transfira esse script para o host usando scp e execute-o em ssh .

Ou alimente o documento here com o shell apropriado:

ssh server sh <<'END_SCRIPT'
script code
goes here
END_SCRIPT

Ou use o sistema Ansible ou semelhante que é feito para configuração remota de vários hosts.

Você geralmente não quer colocar comandos em variáveis.

    
por 02.03.2018 / 08:23
0

Seu método atual é muito complicado, o que dificulta o trabalho.
Isso pode ser simplificado para:

ssh -i $AWS_KEY centos@$HOST sudo sh < ./unifyServiceNode.sh
    
por 02.03.2018 / 16:31
0

Se você estiver disposto a armazenar senhas de texto simples (obviamente, uma má ideia), poderá combinar sshpass -p "my_ssh_password" , ssh << HEREDOC e echo "my_sudo_password" | sudo -S my_cmd para fazer isso.

Exemplo:

sshpass -p "my_ssh_password" ssh my_user@my_ip << 'ENDSSH'
echo "my_sudo_password" | sudo -S my_sudo_command1
echo "my_sudo_password" | sudo -S my_sudo_command2
echo "my_sudo_password" | sudo -S my_sudo_script
ENDSSH
    
por 07.12.2018 / 11:07