bash - SSH 命令执行/变量替换问题
问题描述
我试图执行一个ssh
命令,我看到它从主机(本地)机器而不是我ssh
进入的机器(远程服务器)获取环境变量。
例子:
firstuser@remote> ssh testuser@remote echo ${USER}
firstuser
它期望它回显testuser而不是firstuser因为它是我连接的用户名。
如果有帮助,我正在使用 CentOS7。
关于这个特定问题的任何想法/解释?
解决方案
如果我理解正确,您是${USER}
从主机(本地)机器而不是从 SSH(远程)服务器获取变量。这是因为您在一个命令中执行所有操作。您的命令在被发送到远程 (SSH) 服务器之前正在本地处理 - 这意味着正在替换变量。
您可以通过将命令作为字符串传递来解决此问题,该字符串不会在本地翻译/处理/替换为(在您的情况下 firstuser
)或任何其他先前声明的变量。
firstuser@mymachine> ssh testuser@mymachine 'echo ${USER}'
这里的重要说明echo ${USER}
是单引号,它不适用于双引号。这是基本的bash /shell 规则,但出于礼貌,您可以在https://missing.csail.mit.edu/2020/shell-tools/#shell-scripting找到更多相关信息
简而言之,当您尝试在本地echo firstuser
处理/解释/替换变量时,远程 SSH 服务器会收到 litteral: not echo ${USER}
,这将按预期进行远程处理。
推荐阅读
- ios - 在具有不同捆绑 ID 的两个不同应用程序之间进行 VOIP 呼叫
- visual-studio-code - Visual Studio Code - PHPCS 错误(发生未知错误。请验证是否返回有效的 json 对象)
- c++ - 这个递归函数的时间复杂度是多少?
- vb.net - 在没有数据库的 Datagridview 中搜索数据 - VB.net
- javascript - 如何在使用reactjs提交数据时将数字更改为字符串
- gradle - Gradle 无法正确执行外部命令
- c - 给定程序的输出的解释是什么
- javascript - 在 shopify 网站中为数量选择器创建下拉列表
- javascript - 在 Firebase 中实施身份验证的正确方法是什么?
- android - avc:在 Android 10 上使用 uds 时拒绝 { connectto}