我正在寻找一种将变量解析到 SSH 配置文件的方法。目前我有一个脚本可以在分发之前替换值。我宁愿消除这一步。我已经多次阅读该手册以及发行说明,但没有成功,目前不确定这是否可能。
我最好会做这样的事情:
variable_user = boxuser
Host thisbox
Hostname thisbox
User $variable_user
理想情况下,我希望将配置包含在用户变量中,以便其他所有内容都可以保持标准化。
我是不是要求太多了?
编辑:
配置不会解释传递 $USER
Host thisbox
Hostname thisbox
User $USER
结果:
$ ssh thisbox
$USER@thisbox's password:
%u 也是如此
答案1
使用$USER
环境设置用户
Host MYHOST
Hostname MYHOST
User $USER
检查此以了解更多信息SSH Environment Variables
当 ssh'ing 时,如何在服务器上设置一个在会话之间变化的环境变量?
客户端未解释环境变量的其他原因:
- 是环境变量
set correctly
- 是环境变量
exported
- 检查
ssh_config
是否SendEnv
列出了您的环境变量SendEnv ENV_VARIABLE
- 尝试使用 -t 选项
ssh -t ...
~/.ssh/environment
在客户端 创建文件在服务器上fileENV_VARIABLE=VALUE
设置为yesPermitUserEnvironment
sshd_config
如果您尝试在 SSH 会话中使用用户环境变量并且它们没有被解释,则可能是您的 ssh 客户端未配置为传递环境变量。要传递环境变量,可以在连接到主机时使用 -t 选项。该选项告诉 SSH 在远程主机上分配一个伪 tty,允许传递环境变量
您可能需要检查 SSH 客户端配置或客户端文档
或者
使用SendEnv
和AcceptEnv
指令
添加这个给你/etc/ssh/sshd_config
AcceptEnv SSH_USER
sshd_config(5) — Linux 手册页 |接受环境
或者
使用$SSH_USER
环境来设置一个用途,也许这不适用于所有系统
Host MYHOST
Hostname MYHOST
User $SSH_USER
当您运行 ssh 命令时,它将读取 SSH_USER 环境变量的值来替换 $SSH_USER
每次打开新的终端会话或将其添加到您的终端会话~/.bashrc
以使其持续存在时,您都需要设置 SSH_USER 环境变量。
Search in the Bash CookBook for $SSH_USER
,还有查看章节,我只提到了一个:
检查这几章:
10.3 在脚本中使用配置文件
15.11 从另一台机器获取输入
10.3 在脚本中使用配置文件 问题 您想要为一个或多个脚本使用一个或多个外部配置文件。解决方案您可以编写大量代码来解析某些特殊的配置文件格式。帮自己一个忙,不要这样做。只需将配置文件设为 shell 脚本并使用食谱 10.2 中的解决方案即可。讨论 这只是获取文件的一个具体应用。然而,值得注意的是,您可能需要稍微考虑一下如何减少 bash 合法语法的所有配置需求。特别是,您可以使用布尔标志和可选变量(参见第 5 章和第 15.11 节):
# In config file
VERBOSE=0 # 0 or '' for off, 1 for on
SSH_USER='jbagadonutz@' # Note trailing @, set to '' to use the current user
# In script
[ "$VERBOSE" ] || echo "Verbose msg from $0 goes to STDERR" >&2
[...]
ssh $SSH_USER$REMOTE_HOST [...]
当然,取决于用户来获取正确的配置文件可能是偶然的,因此我们可以在脚本中执行此操作,而不是要求用户阅读注释并添加尾随@:
# If $SSH_USER is set and doesn't have a trailing @ add it:
[ -n "$SSH_USER" -a "$SSH_USER" = "${SSH_USER%@}" ] && SSH_USER="$SSH_USER@"
或者只是使用:
ssh ${SSH_USER:+${SSH_USER}@}${REMOTE_HOST} [...]
进行相同的替换。 bash 变量运算符 :+ 将执行以下操作:如果 $SSH_USER 有一个值,它将将该值返回到 :+ 右侧(在本例中,我们指定了变量本身以及一个额外的 @);否则,如果未设置或为空,则不会返回任何内容。另请参见 • 第 5 章 • 第 10.2 节“通过包含和源代码重用代码” • 第 15.11 节“从另一台机器获取输入”
讨论 我们在这里做了一些有趣的事情。首先,注意 $SSH_USER 和 $SSH_ID 是如何工作的。当它们有值时,它们会产生影响,但当它们为空时,它们会插入到空集并被忽略。这使我们能够抽象代码中的值,这有助于将这些值放入配置文件中,将代码放入函数中,或两者兼而有之。
答案2
如果您没有自定义的 bash/ssh 环境,则 $USER 不适用于所有系统或版本,因为 bash 不会解释您的 ssh 配置文件
您可以使用 .bashrc 文件修复此问题,或者创建一个 custom_ssh 文件,通过 .bashrc 文件获取它并创建别名或变量
~/.bashrc
# add to the end of file
source custom_ssh_config
custom_ssh_config 文件使用别名
#!/bin/bash
# USE ALIAS
alias ssh_user_1="ssh ${USER}@HOSTNAME"
user2="myuser2"
alias ssh_user_2="ssh -l ${user2} thisbox"
运行:
ssh_user_1
或ssh_user_2
custom_ssh_config 文件使用变量
#!/bin/bash
# USE VARIABLE
ssh_user_1="${USER}"
user2="myuser2"
ssh_user_2="${user2}"
跑步:
ssh -l $ssh_user_1 thisbox
或者ssh -l $ssh_user_2 thisbox
对于 $USER:
ssh -l $USER thisbox
你的 ssh 配置文件中不需要用户 $USER