在本地运行 ssh 命令时如何引用远程计算机的环境变量?

在本地运行 ssh 命令时如何引用远程计算机的环境变量?

我想在远程服务器(Cent OS 7)上执行命令并使用该服务器上定义的环境变量。但是,当我运行这个命令时

ssh [email protected] "PGPASSWORD=$DB_PASS psql -U $DB_USER -d $DB_NAME -c 'COPY myapp_currencyprice to STDOUT WITH (DELIMITER \",\", FORMAT CSV, HEADER)' > /tmp/prices.csv"

看起来该命令正在尝试使用来自本地主机的“$DB_PASS”和其他环境变量,而不是来自“remotehost.com”。从远程服务器引用环境变量的正确方法是什么?

答案1

您需要使用单引号来阻止本地 shell 获取字符串:

ssh [email protected] 'stuff here...'

然后您需要交换内部引号:

ssh [email protected] 'PGPASSWORD=$DB_PASS psql -U $DB_USER -d $DB_NAME -c "COPY myapp_currencyprice to STDOUT WITH (DELIMITER \",\", FORMAT CSV, HEADER)" > /tmp/prices.csv'

但是,这仍然不起作用,因为您.bash_profile不会被包含在内,因为您没有使用交互式 shell。此时最明显的解决方案是显式包含它:

ssh [email protected] '. .bash_profile; PGPASSWORD=$DB_PASS psql -U $DB_USER -d $DB_NAME -c "COPY myapp_currencyprice to STDOUT WITH (DELIMITER \",\", FORMAT CSV, HEADER)" > /tmp/prices.csv'

您可能需要查找这两个参考文献以了解不同类型的报价之间的区别

答案2

(评论转换为答案,由 terdon 提议......)

尝试转义 $ 符号以防止局部扩展。喜欢

"PGPASSWORD=\$DB_PASS psql -U \$DB_USER -d $DB_NAME ..."

正如您在评论中提到的那样,究竟是什么不起作用?您是否也将命令用单引号括起来?都不要,选一个。

相关内容