【问题标题】:Environmental variables in interactive and non-interactive shells交互式和非交互式 shell 中的环境变量
【发布时间】:2016-02-17 19:54:57
【问题描述】:

假设我正在尝试执行一个包含一行的脚本 userScript

env > ENVIRONMENTAL_VARIABLES.txt

我通过以下两种方式做到这一点。


1.

通过使用 ssh 实际登录:

ssh host
password:xyz***
./userScript

ENVIRONMENTAL_VARIABLES.txt 确实被创建并包含命令 env 的结果。


2.

ssh -i key host 'userScript'

在这种情况下不会创建 ENVIRONMENT_VARIABLES.txt。

另外,我相信第一种情况将是交互式外壳的示例,而第二种情况是非交互式外壳的示例(如果我错了,请纠正我。)。并且两种机制存在差异(.profile、.bashrc 等文件是否被执行)。

如何确保在第二种情况下也创建 ENVIRONMENT_VARIABLES.txt?要为其更改哪些环境变量?

【问题讨论】:

  • 它是根本没有被创建,还是没有在您期望的地方创建?如果您尝试完整路径和/或在脚本中打印出当前目录会发生什么?
  • @EtanReisner 根本没有被创建。这是一个简化的 sn-p。但是我并没有犯这么幼稚的错误。另外,如果 ENVIRONMENT_VARIABLES.txt 已经存在,则无法写入。
  • 文件及其目录的权限是什么?您在每种方法中都向哪个用户发送密码?
  • @EtanReisner ssh -i Key host 'ls -l ENVIRONMENT_VARIABLES.txt' 给了我 -rw-r--r-- 权限,通过 ssh 登录时的 ls -l 也是如此。在这两种情况下用户也是相同的,我在 $USERS_HOME/scripts 目录中执行此操作
  • 使用ssh -i key host 后手动运行脚本有效吗?是否有强制命令/等。也许是那个钥匙?

标签: linux shell unix ssh environment-variables


【解决方案1】:

是的,为交互式和非交互式会话提供了一组不同的启动脚本。

当您在ssh 命令行上指定命令时,默认情况下会启动非交互式会话。

要强制交互式会话,请使用-t 开关。见ssh man page

-t 强制伪终端分配。 ...

【讨论】:

    【解决方案2】:

    这可能不依赖于伪终端。正如我所看到的,不同之处在于命令的规范。在ssh 命令行上使用完整路径,或来自$HOME 路径的相对路径:

    ssh -i key host '/add/path/here/userScript'
    

    如果有问题,请查看 ssh 的输出,并可能在 ssh 上使用 -v 选项再次运行该命令。

    另外,请注意您的当前目录,ssh 通常从您的主目录开始。如果您的脚本不在您的主目录中,则在此答案中使用上述示例中的路径。

    如果您发布未创建文件的命令的实际输出,您可以更快地获得更好的答案。

    【讨论】:

    • 如果用户脚本存在于主目录本身会怎样?
    • 您应该在前面加上./,如./userScript。对不起,我没有说得更清楚。这就是我所说的“命令规范”的意思,我的措辞很糟糕。这就是您在示例中显示的差异。一个有./,另一个没有。是的,哇,当我重读我的答案时,我发现我真的没有把最明显的事情说清楚。对不起!
    猜你喜欢
    • 1970-01-01
    • 2013-04-16
    • 2021-12-08
    • 2017-07-04
    • 2017-11-24
    • 2012-10-18
    • 1970-01-01
    • 2020-08-17
    • 2016-05-16
    相关资源
    最近更新 更多