通过 sudo 通过 ssh 运行脚本文件

通过 sudo 通过 ssh 运行脚本文件

我可以以可以执行以下操作的用户身份登录到远程计算机sudo su -。我无法以 root 身份登录。

我本地有一个脚本,想在远程计算机上运行。此外,该脚本是通过另一个脚本发送到那里的。

我不知道怎么办。我在这里红色了很多问答,但没有成功。我最接近的:

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

最终得到以下输出:

======== [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.

这是“最接近的”,因为它看到各个命令,但不在 之下sudo,因为第一行<<EOF没有正确(未)转义。

sudo**我应该如何在over下执行任意脚本ssh?”

答案1

发帖后我很快就明白了。

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.

SSH 命令周围的额外's 似乎是问题所在,我还需要通过echo.

不过,我不太确定这只是一个幸运的黑客还是正确的方法。说实话,我完全迷失在 Bash 的引用评价中了:)

答案2

您当前的方法非常复杂,这导致其难以使用。
这可以简化为:

ssh -i $AWS_KEY centos@$HOST sudo sh < ./unifyServiceNode.sh

答案3

将需要执行的命令放入脚本中,使用该脚本将该脚本传输到主机scp并通过 运行它ssh

或者,将此处文档提供给适当的 shell:

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

或者,使用 Ansible 或类似的系统,用于远程配置多个主机。

您通常不想将命令放入变量中。

答案4

如果您愿意存储纯文本密码(显然是一个坏主意),您可以组合sshpass -p "my_ssh_password",ssh << HEREDOCecho "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

相关内容