使用 AIX 的 ksh 实现以非交互模式读取配置文件脚本

Posted

技术标签:

【中文标题】使用 AIX 的 ksh 实现以非交互模式读取配置文件脚本【英文标题】:Reading profile script in non-interactive mode with AIX implementation of ksh 【发布时间】:2014-08-07 14:52:09 【问题描述】:

请注意,这是一个与 AIX 相关的问题。

我有一个在 Redhat 上运行的 jenkins 服务器,它通过 SSH 在 AIX 服务器上运行一个节点。 这些命令使用 SSH 以非交互方式运行到 AIX 机器上以 ksh 作为其标准 shell 的用户。

问题是这个构建需要一些环境变量,我似乎无法让它工作。

我尝试过: Jenkins 允许我为会话设置一些环境变量。所以我尝试了:

ENV="$HOME/.profile"

我尝试创建一个包含

的 .kshrc 文件
. .profile

但这些方法似乎都不能让 KSH 运行 .profile 脚本。

.profile 脚本包含我需要的用户的环境设置。

如何在执行命令之前获得 KSH 的 AIX 实现来运行我的 .profile 脚本?

【问题讨论】:

【参考方案1】:

大多数 shell 不会在非交互式会话中获取其 .profile 文件。一个简单的解决方案是自己获取 .profile 作为您发送的命令的一部分。

所以不是

yourcommand1; yourcommand2

你应该发送

. ~/.profile; yourcommand1; yourcommand2

通过 ssh

阅读有关 Jenkins 控制 ssh 命令的评论后更新

如果您的 ssh 命令由 Jenkins 执行,您应该查看 https://wiki.jenkins-ci.org/display/JENKINS/SSH+Slaves+plugin,尤其是“登录配置文件”段落。

我会说这些解决方案之一是最好的

    使用节点的配置页面从 Jenkins 设置所有环境变量。安装 EnvInject 插件来执行此操作。 围绕获取配置文件脚本的从站上的 java 命令编写一个包装器,并调整 JavaPath(也在节点的配置页面上)以指向该包装器。

【讨论】:

问题是我无法控制正在发送的命令。詹金斯会。 有没有办法让环境只获取配置文件脚本? 如果您实施选项 2,您应该能够获取配置文件脚本,然后启动 java。 对不起,我不清楚。如何让 KSH 在非交互模式下实际读取配置文件脚本的主要问题仍未得到解答。在创建案例之前,我已经找到了您在答案中描述的链接(我应该写在案例中,请原谅)。问题是我们定义了 8 个不同的 Java 版本,为它们创建包装器既不切实际又丑陋。如果包装脚本是解决此问题的唯一方法,那很好,就这样吧,但我宁愿让 KSH 处理它。【参考方案2】:

你需要明确告诉 Jenkins 你想在ksh shell 中执行它们。 默认情况下,Jenkins 以sh <commands> 运行。

在你的 shell 命令中添加一个 shebang 作为第一行,

#!/bin/ksh

【讨论】:

shell 不依赖于接收机器的 /etc/passwd 文件上的用户吗?【参考方案3】:

我所知道的在 AIX 上设置适用于非交互式 shell 的环境变量的唯一方法是通过 /etc/environment。我相信这是正确的地方,但它当然适用于所有用户和所有 shell。

【讨论】:

以上是关于使用 AIX 的 ksh 实现以非交互模式读取配置文件脚本的主要内容,如果未能解决你的问题,请参考以下文章

有啥方法可以在 Linux/AIX 中从 ksh 更改进程名称?

使用 ksh(AIX) 时如何在 awk 中调用变量? [复制]

安装KornShell(KSH)

如何克服 Linux 上的 ksh 与 AIX/Solaris/HPUX 上安装的 ksh 之间的不兼容问题?

阵列在 AIX KSH 中不起作用

ksh 正则表达式错误'=〜`意外