我有一组(第三方)shell 脚本,它们应该连接到远程主机并启动一些守护进程(hadoop,如果有的话)。这些脚本严重依赖主机名来配置 pid 文件夹、数据目录等。
我现在需要做的是使用 Arch 在单机上创建一些测试/开发环境,这意味着:
- 配置 /etc/hosts 为 127.0.0.1 提供一些别名,例如 data1、data2、data3 (这是琐碎的部分)
- 配置对 localhost 的无密码 SSH 访问(这也很简单)
- 以某种方式设置当前 SSH 会话的主机名,就像我使用“ssh data1”连接一样 - 那么主机名应该是“data1” - 这是我无法弄清楚的。
所以我需要解决2个问题:
- 如何将一些环境变量或类似的东西传递给远程主机,以便它对那里的所有脚本都可见
- 如何仅在该会话的远程主机上设置主机名
而这一切都发生在同一台计算机上。
答案1
系统的主机名不能以编程方式设置为常规使用,也没有环境变量可以有效地更改它。
您可能会看到一个变量,例如,$HOSTNAME
但这通常只是为了方便起见,不会以任何有意义的方式更改您的系统主机名。
我想如果我是你,我会选择一个自己选择的环境变量,并在登录时将其设置为用户环境的一部分,然后在脚本中下游使用该变量,而不是尝试与实际的环境变量进行合作系统的主机名。
主机名命令
您可以通过发出以下命令以宽松的方式更改系统名称:
$ sudo hostname <somename>
然而,这种方法可能很棘手,因为主机名通常存储在多个位置,其中一些位置仅在启动期间读取一次,再也不会读取。
鉴于此,我发现这是一条艰难的道路,并且将通过大量的黑客攻击和削减来以简单的方式覆盖系统的主机名。
我将给您留下这份指南,其中显示了您在尝试执行此操作时可能会遇到的一些问题。它的标题是:如何更改 Linux 系统的主机名。
答案2
虽然您无法更改单个进程的主机名(嗯,它可能可以使用命名空间),您可以更改HOSTNAME
环境变量。
至于将环境变量从客户端转发到服务器,请参阅AcceptEnv
和PermitUserEnvironment
optins forsshd
和SendEnv
for ssh
(请参阅手册页sshd_config(5)
和ssh_config(5)
了解详细信息)。
答案3
SSH 通常设置为传递一些被认为安全且与系统无关的环境变量,即与语言环境相关的环境变量:LC_*
.因此,在许多安装中,您可以通过设置诸如 之类的变量来通过环境传递数据LC_DESIRED_HOSTNAME
。服务器允许您传递哪些环境变量由中AcceptEnv
的设置决定sshd_config
SendEnv
,客户端尝试传递哪些环境变量由中的设置决定~/.ssh/config
。
hostname
您可以通过以 root 身份调用带有参数的命令来设置所有进程的主机名,直到下次重新启动为止。
在 Linux 上,如果运行unshare -u someprogram
,那么someprogram
它的子进程将在单独的进程中运行名称空间它有自己的主机名。命名空间内的主机名一开始与系统的其余部分相同,但可以独立更改。除非您的内核版本为 3.8 或更高版本,否则需要以 root 身份完成此操作。
unshare -u -- sh -c 'hostname "$LC_HOSTNAME"; service hadoop start'