我试图弄清楚当我重启 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 读取。
答案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) 被找到。
这会是一个缓慢的生意,在此期间去给自己倒点咖啡吧。