SSH 配置中的变量用户名

SSH 配置中的变量用户名

我正在寻找一种将变量解析到 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 环境变量

将环境变量传递到 ssh 连接

SSH - 通过每个连接设置环境变量

当 ssh'ing 时,如何在服务器上设置一个在会话之间变化的环境变量?

客户端未解释环境变量的其他原因:

  1. 是环境变量set correctly
  2. 是环境变量exported
  3. 检查ssh_config是否SendEnv列出了您的环境变量 SendEnv ENV_VARIABLE
  4. 尝试使用 -t 选项ssh -t ...
  5. ~/.ssh/environment在客户端 创建文件在服务器上fileENV_VARIABLE=VALUE 设置为yesPermitUserEnvironmentsshd_config

如果您尝试在 SSH 会话中使用用户环境变量并且它们没有被解释,则可能是您的 ssh 客户端未配置为传递环境变量。要传递环境变量,可以在连接到主机时使用 -t 选项。该选项告诉 SSH 在远程主机上分配一个伪 tty,允许传递环境变量

您可能需要检查 SSH 客户端配置或客户端文档

或者

使用SendEnvAcceptEnv指令

添加这个给你/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 从另一台机器获取输入

Bash 食谱

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_1ssh_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

相关内容