Поиграв с этим сценарием, я понял, что проблема с кодировкой была в исходном файле, который я экспортировал из окружения Windows.
Я повторил ту же процедуру, на этот раз с аргументом "сохранить как", выбрал тип кодировки UTF8, и файл выглядел нормально в Linux, а после изменения и экспорта обратно в Windows выглядел нормально в блокноте Windows тоже.
Me di cuenta poco después de la publicación.
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.
Parece que los '
adicionales alrededor del comando SSH fueron el problema, y también necesitaba hacer la nueva línea a través de echo
.
Sin embargo, no estoy muy seguro de si se trata de un truco de la suerte o de la forma correcta de hacerlo. Para ser honesto, estoy completamente perdido en la evaluación de citas de Bash:)
Coloque los comandos que necesita ejecutar en un script, transfiera ese script al host usando scp
y ejecútelo a través de ssh
.
O, envíe el documento aquí -al shell apropiado:
ssh server sh <<'END_SCRIPT'
script code
goes here
END_SCRIPT
O bien, utilice Ansible o un sistema similar creado para la configuración remota de múltiples hosts.
Por lo general, no desea poner comandos en variables.
Su método actual es muy complicado, por lo que es difícil trabajar con él.
En cambio, esto se puede simplificar a:
ssh -i $AWS_KEY centos@$HOST sudo sh <./unifyServiceNode.sh
Если вы хотите хранить простые текстовые пароли, (явно плохая идея ), вы можете комбинировать sshpass -p "my_ssh_password"
, ssh << HEREDOC
и echo "my_sudo_password" | sudo -S my_cmd
, чтобы сделать это.
Пример:
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