当我登录或重新启动机器时,会运行哪些文件?

当我登录或重新启动机器时,会运行哪些文件?

我试图弄清楚当我重启 ubuntu 机器时哪个“脚本”(实际上可能是“*rc”文件)正在运行特定命令。我尝试 grepping 以查找重启后登录机器时显示的内容,但无法找到它。

例如,我知道 .bash_profile 在我登录时是“来源”,但其他运行的这将帮助我追踪运行我需要更新的一组旧命令的脚本/文件。

谢谢!

这是我登录时发生的情况:

bos-mp2o6:~ user$ ssh -A X.X.X.X
[email protected]'s password: 
Linux bos-lpwy9 2.6.32-54-generic #116-Ubuntu SMP Tue Nov 12 19:23:22 UTC 2013 x86_64 GNU/Linux
Ubuntu 10.04.4 LTS

Welcome to Ubuntu!
 * Documentation:  https://help.ubuntu.com/

New release 'precise' available.
Run 'do-release-upgrade' to upgrade to it.

Last login: Tue Dec 31 10:53:25 2013 from 172.19.43.138
Agent pid 2117
/home/user/.ssh/internal/2013-07-29: No such file or directory
/home/user/.ssh/deployed/2013-07-29: No such file or directory
Identity added: /home/user/.ssh/external/2013-07-29 (/home/user/.ssh/external/2013-07-29)

如果您注意到“已添加身份”部分,那就是我要找的部分。所以我使用了以下命令(没有成功):

[user@Linux_Desktop:~]$grep_bash 2013-07-29
[user@Linux_Desktop:~]$

答案1

这取决于很多因素。我猜你实际上并不希望在机器重启时运行这些文件(有很多),而是希望bash在你登录或打开终端时由你的 shell 运行这些文件(例如)。

查找相关命令的最简单方法是 grep 所有可能的 shell 启动文件,包括登录 shell 和交互式 shell。我在 my 中定义了以下函数$HOME/.bashrc

grep_bash(){
  for f in  ~/.bashrc ~/.profile ~/.bash_profile ~/.bash_login \
        /etc/profile /etc/bash.bashrc /etc/environment; 
  do 
    [ -e $f ] && grep -H "$@" $f; 
  done
}

然后我可以使用它在这些文件中搜索感兴趣的字符串:

$ grep_bash foo
/home/terdon/.bashrc:echo foo

实际读取的文件取决于你运行的 shell 类型。以下是来自的相关部分man bash

   When  bash is invoked as an interactive login shell, or as a non-inter‐
   active shell with the --login option, it first reads and executes  com‐
   mands  from  the file /etc/profile, if that file exists.  After reading
   that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile,
   in  that order, and reads and executes commands from the first one that
   exists and is readable. 

   When an interactive shell that is not a login shell  is  started,  bash
   reads  and  executes  commands  from /etc/bash.bashrc and ~/.bashrc, if
   these files exist.  This may be inhibited by using the  --norc  option.
   The  --rcfile  file option will force bash to read and execute commands
   from file instead of /etc/bash.bashrc and ~/.bashrc.

在大多数 *nix 中(我知道的唯一例外是 OSX),打开新终端时的默认 shell 是交互式、非登录 shell,因此~/.bashrc公司信息都会被读取。

最后,您还知道/etc/environment哪些用于设置全局环境变量以及哪些应该被大多数 shell 读取。


在与原帖讨论后聊天@derobert帮助我们弄清楚这里的问题是由引起的/etc/ssh/sshrc

答案2

“Agent pid” 是从启动ssh 代理,而“添加身份”则来自运行ssh 添加将密钥加载到代理中。中间的部分可能是自定义脚本。

如果您的登录 shell 是 bash(默认),它会加载以下存在的第一个文件:~/.bash_profile、、~/.bash_login~/.profile检查它加载了哪个文件并将其添加set -x到顶部,然后再次登录或运行bash --login。这会告诉 bash 打印它执行的每个命令的跟踪。在跟踪中查找这些消息,这应该会告诉您是什么打印了它们。

如果消息在第一个跟踪之前出现,那么它们可能来自全局初始化文件:/etc/profile,或中的脚本/etc/profile.d(或它们调用的脚本)。

如果运行 时未显示该消息bash --login,则该消息来自 SSH 守护程序启动的某些内容,而不是来自 shell。检查是否在聚丙烯酰胺stack:/etc/pam.d/sshd/etc/pam.d/common-*文件。如果仅在使用 SSH 登录时发生这种情况,则可能是~/.ssh/rc或者/etc/ssh/sshrc在服务器上。如果仅在使用特定 SSH 密钥登录时发生这种情况,则可能是与密钥关联的命令~/.ssh/authorized_keys在服务器上。

答案3

一个更简单的解决方案是使用寻找grep文件命令,组合方式如下:

  find / -type f -mount -exec sh -c ' file "{}" | grep text 1>/dev/null && grep -l "2013-07-29" "{}" ' \;

首先,找到所有文件,并将每个文件的名称传递给 shell,shell 将首先测试其文件类型,如果发现 文本输入后,将尝试定位字符串2013-07-29在里面,吐出文件名,当且仅当(选项-l) 被找到。

这会是一个缓慢的生意,在此期间去给自己倒点咖啡吧。

相关内容