站内链接:

需求和问题

对于远程执行服务器脚本, 在平常使用过程中很少涉及, 一般仅仅在运维自动化相关项目中会碰到, 比如 paramiko 或者 fabric 等组件底层实现中会出现远程脚本调用的操作. 在远程执行服务器脚本的时候会碰到很多问题:

  • 脚本执行是否挂载后台运行的问题
  • 脚本执行中环境变量的载入问题
  • 脚本执行中 sleep 等待的问题, 脚本执行过程中
  • 脚本执行中超时问题导致的脚本执行失败或者脚本执行时间过长(雪崩效应)
  • 脚本执行中因特殊网络问题导致复用的网络连接无法使用进而对本次调动产生严重影响的问题

对于不同的问题需要由不同的产品校验方案和检查手动进行适配处理, 当然在处理这些问题之前我们至少应该简单的介绍下远程执行服务器脚本和远程登录服务器之后再执行脚本的异同点, 以便能更好的处理后续碰到的其他问题. 计算机世界中万事万物都是互相连接的, 只有了解了某一个技术底层基础逻辑或者相关的知识点才能更好的应用该技术, 本篇文章主要讲解远程登录四种方式下环境变量的载入问题以及此四种方式具体的表现方式. 这里先简单介绍下 bash 四种模式的分类, 具体情况和区别需要在第三章进行说明:

    1. 登录 shell, 交互模式: 用户登录机器获取第一个 shell, 用户通过 ssh 远程登录获取 shell
    1. 登录 shell, 非交互模式: bash -l script.sh, 其中-l表示将 shell 作为一个 login shell 启动
    1. 非登录 shell, 交互模式: 在 shell 中运行 bash 命令
    1. 非登录 shell, 非交互模式: bash script.sh或者远程执行命令

其中

  • 登录shell表示用户以非图形化界面或者以ssh登录到机器上时获取的第一个 shell
  • 交互式表示该 shell 是可交互的, stdin, stdout, stderr 都显示在控制台上

配置载入

在开始介绍四种远程登录方式之前我们先简单介绍下 bash, zsh 登录过程可能涉及的配置文件自己他们的加载顺序, 其中涉及加载顺序部分仅仅简单介绍, 更加详细的介绍见第三章说明.

  1. bash shell 涉及的配置文件说明
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
+----------------+-----------+-----------+------+
| |Interactive|Interactive|Script|
| |login |non-login | |
+----------------+-----------+-----------+------+
|/etc/profile | A | | |
+----------------+-----------+-----------+------+
|/etc/bash.bashrc| | A | |
+----------------+-----------+-----------+------+
|~/.bashrc | | B | |
+----------------+-----------+-----------+------+
|~/.bash_profile | B1 | | |
+----------------+-----------+-----------+------+
|~/.bash_login | B2 | | |
+----------------+-----------+-----------+------+
|~/.profile | B3 | | |
+----------------+-----------+-----------+------+
|BASH_ENV | | | A |
+----------------+-----------+-----------+------+
| | | | |
+----------------+-----------+-----------+------+
| | | | |
+----------------+-----------+-----------+------+
|~/.bash_logout | C | | |
+----------------+-----------+-----------+------+
  1. zsh 配置文件说明:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
+----------------+-----------+-----------+------+
| |Interactive|Interactive|Script|
| |login |non-login | |
+----------------+-----------+-----------+------+
|/etc/zshenv | A | A | A |
+----------------+-----------+-----------+------+
|~/.zshenv | B | B | B |
+----------------+-----------+-----------+------+
|/etc/zprofile | C | | |
+----------------+-----------+-----------+------+
|~/.zprofile | D | | |
+----------------+-----------+-----------+------+
|/etc/zshrc | E | C | |
+----------------+-----------+-----------+------+
|~/.zshrc | F | D | |
+----------------+-----------+-----------+------+
|/etc/zlogin | G | | |
+----------------+-----------+-----------+------+
|~/.zlogin | H | | |
+----------------+-----------+-----------+------+
| | | | |
+----------------+-----------+-----------+------+
| | | | |
+----------------+-----------+-----------+------+
|~/.zlogout | I | | |
+----------------+-----------+-----------+------+
|/etc/zlogout | J | | |
+----------------+-----------+-----------+------+

bash 四种模式

login and Interactive

该模式可以通过如下情况实现:

  • bash -l打开一个新的 login shell
  • 用户登录到非图形化界面机器获取的第一个 shell
  • 用户使用ssh user@host登录获得的 shell

此时用户配置文件的加载模式参考第二章的说明. 其中关于终端的说明见终端介绍说明.

login and non-interactive

该模式可以通过如下情况实现:

  • bash -l script.sh, 其中bash -l为 login shell, script.sh表示以非交互方式执行脚本

non-login and interactive

该模式可通过如下情况实现:

  • bash
  • ssh user@host -t Command, 远程执行命令并强制分配伪终端

non-login and non-interactive

该模式可通过如下情况实现:

  • bash script.sh
  • ssh user@host command, 这是我们最经常使用到的方式

常用命令

  1. 脚本中添加--login, 例如:
1
#/bin/bash --login

表示执行该脚本的时候强制为bash -l script.sh方式执行

  1. 跳过默认配置文件: bash --profile

  2. bash -n 不行命令, 仅仅检查脚本语法, bash -v先输出命令行在执行命令, bash -x先输出每一条命令再执行

参考