我正在尝试在 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
。您可能需要根据设置所需环境变量的文件调整实际命令。