在 bash 脚本中,如何使用远程计算机的环境变量为远程计算机编写命令?

在 bash 脚本中,如何使用远程计算机的环境变量为远程计算机编写命令?

我正在尝试在 Ubuntu 18 上编写一个 bash 脚本。我有以下脚本......

#!/bin/bash -l
  
ssh myuser@remote-machine 'mysql -u $DB_USER --password=$DB_PASS $DB_NAME < /tmp/dump.sql'

我现在的主要问题是我希望根据远程计算机的环境而不是我运行 bash 脚本的环境来解释环境变量。我认为现在,mysql命令正在使用当前环境。我需要进行哪些更改才能使用远程计算机的 env 中的环境变量?

答案1

正如对您问题的评论中所述(特登,巴克斯米),单引号会阻止您的命令在本地展开。

但是,远程环境可能未填充,因为引用man 1 ssh(粗体文本是我的):

如果一个命令指定后,将在远程主机上执行反而登录 shell 的。

不过,可以显式调用远程登录 shell:

ssh myuser@remote-machine bash -lc \
  "'"'mysql -u "$DB_USER" --password="$DB_PASS" "$DB_NAME" </tmp/dump.sql'"'"

请注意双层引号:我们确保整个命令不会通过内部单引号在本地扩展,并且远程主机接收用单引号(外部双引号)括起来的命令,以便它在作为命令字符串传递给 Bash 之前不会进行扩展和分割。

或者,无需额外引用,您可以通过ssh标准输入提供命令并调用来获得远程登录 shellssh 没有命令参数:

echo 'mysql -u "$DB_USER" --password="$DB_PASS" "$DB_NAME" </tmp/dump.sql' |
  ssh -T myuser@remote-machine

-T用于避免当标准输入不是终端时出现有关未分配伪终端的警告。

由于您的问题是关于 Bash:也可以使用此处的字符串,增加一点便利:

ssh -T myuser@remote-machine <<<'mysql ...'

您实际需要的 shell 类型取决于远程环境的设置方式。当作为非交互式登录 shell,Bash 源了几个脚本:(/etc/profile如果存在),那么第一的~/.bash_profile在、~/.bash_login、 和之间找到并可读的一个~/.profile;它可能不会来源~/.bashrc。您可能需要根据设置所需环境变量的文件调整实际命令。

相关内容