我想在远程服务器(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 ..."
正如您在评论中提到的那样,究竟是什么不起作用?您是否也将命令用单引号括起来?都不要,选一个。