【问题标题】:How can I get environment variables from remote Ubuntu server while executing a script on the remote server from local ubuntu system using sshpass?使用 sshpass 从本地 ubuntu 系统执行远程服务器上的脚本时,如何从远程 Ubuntu 服务器获取环境变量?
【发布时间】:2018-06-27 07:01:02
【问题描述】:

从本地 Ubuntu 系统在远程服务器上执行脚本时,如何从远程 Ubuntu 服务器获取环境变量?我在不同的文件中为 vagrant 用户配置了很多环境变量。

我使用以下命令从本地 Ubuntu 系统执行脚本

sshpass -f .passwd ssh -o StrictHostKeyChecking=no -t vagrant@192.168.1.180 "sh script.sh"

.passwd 文件包含密码

执行此脚本时,配置的环境变量不可用于脚本执行。我已经使用此命令获取了配置文件、 .bash_profile 、 /etc/profile 等,例如

sshpass -f .passwd ssh -o StrictHostKeyChecking=no -t vagrant@192.168.1.180 "source .bash_profile; sh script.sh"

请帮我解决这个问题。

注意:环境变量在直接 ssh 会话和脚本上也可以正常工作。

【问题讨论】:

  • source .bash_profile; sh script.sh 运行一个不是 Bash 并且在子进程中运行的 shell,这意味着任何已设置但未导出的变量对脚本不可见。也许你想要exec 而不是sh?或者你想要的变量可能实际上并没有在远程服务器上的vagrant用户的$HOME/.bash_profile中定义?
  • 注意:环境变量在直接 ssh 会话和脚本上也可以正常工作。
  • 您的问题已经说明了这一点。现在你能回答我问的后续问题吗? .bash_profile 中定义的所有变量还是它无条件获取的文件?变量是否导出?您希望脚本由 Bash 还是由 sh 运行,如果是前者,您已经在运行的实例,还是另一个?
  • 所有变量都在.bash_profile中定义,并在远程服务器中导出。我的大部分脚本都在 bash 中,因此最好为 bash 找到解决方案。
  • exec 对你有用吗?

标签: linux bash shell ubuntu ssh


【解决方案1】:

-i 选项与 bashsh 解决了这个问题。现在我可以在非交互式 ssh 连接中获得交互式 ssh 会话。

@marcolz @tripleee 感谢您的帮助

sshpass -f .passwd ssh -o StrictHostKeyChecking=no -t vagrant@192.168.1.180 "bash -i  script.bash"

【讨论】:

    【解决方案2】:

    如果您将-l 传递给sh,它的行为就好像它是一个登录shell 并会获取您的shell 资源文件,所以请尝试:

    sshpass -f .passwd ssh -o StrictHostKeyChecking=no -t vagrant@192.168.1.180 "sh -l script.sh"
    

    【讨论】:

    • 如果 sh 是 Bash,那么是的。
    • @tripleee 因为这是关于 ubuntu 服务器的,所以它可以是 bashdash,这应该适用于两者。在vagrant 图像中,理论上它当然可能是别的东西。
    • 哦,对了,我在寻找该选项,但不知何故在dash manual page 中错过了它……但它就在那里;它只是从 SYNOPSIS 部分中丢失。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2013-08-16
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    相关资源
    最近更新 更多