3

Я пытаюсь выяснить, какой "скрипт" (на самом деле это, вероятно, файл «* rc») выполняет определенную команду, когда я перезагружаю свою машину с Ubuntu. Я попытался найти то, что отображается, когда я вхожу в компьютер после перезагрузки, но я не смог его найти.

Я знаю, что, например, файл .bash_profile "получен", когда я вхожу в систему, но какие другие запускаются. Это поможет мне отследить скрипт / файл, который выполняет старый набор команд, которые мне нужно обновить.

Спасибо!

вот что происходит, когда я вхожу в систему:

bos-mp2o6:~ user$ ssh -A X.X.X.X
user@X.X.X.X'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)

если вы заметите кусок "Identity добавлен", это то, что я ищу. Поэтому я использовал следующую команду (без удачи):

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

3 ответа3

3

Это будет зависеть от многих вещей. Я предполагаю, что на самом деле вы не хотите, чтобы файлы запускались при перезагрузке компьютера (их много), а запускались вашей оболочкой (например, bash) при входе в систему или открытии терминала.

Самый простой способ найти соответствующую команду - просмотреть все возможные файлы запуска оболочки, как для входа в систему, так и для интерактивных оболочек. У меня есть следующая функция, определенная в моем $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

Считываемые файлы зависят от типа используемой оболочки. Это соответствующие разделы 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) оболочкой по умолчанию при открытии нового терминала является интерактивная оболочка, не входящая в систему, поэтому ~/.bashrc и компания читаются.

Наконец, у вас также есть /etc/environment который используется для установки глобальных переменных среды и который должен читаться большинством оболочек.


После обсуждения с OP в чате, @derobert помог нам выяснить, что проблема здесь была вызвана /etc/ssh/sshrc .

2

«Agent pid» - это запуск ssh-agent, а «Identity добавлен» - запуск ssh-add для загрузки ключей в агент. Немного посередине, вероятно, пользовательский скрипт.

Если ваша оболочка входа - bash (по умолчанию), она загружает первый из следующих существующих файлов: ~/.bash_profile , ~/.bash_login , ~/.profile . Проверьте, какой из них загружается, и добавьте set -x вверху, затем войдите снова или запустите bash --login . Это говорит bash печатать трассировку каждой команды, которую он выполняет. Ищите эти сообщения в трассировке, это должно сказать вам, что их печатает.

Если сообщения приходят до первой трассировки, то они могут быть из глобального файла инициализации: /etc/profile или скриптов в /etc/profile.d (или скриптов, которые они вызывают).

Если сообщение не отображается при запуске bash --login , то оно исходит от чего-то, запущенного демоном SSH, а не из оболочки. Проверьте, добавили ли вы что-то необычное в стек PAM : /etc/pam.d/sshd или /etc/pam.d/common-* . Если это происходит только при входе в систему с помощью SSH, это может быть команда в ~/.ssh/rc или /etc/ssh/sshrc на сервере. Если это происходит только при входе в систему с определенным ключом SSH, это может быть команда, связанная с ключом в ~/.ssh/authorized_keys на сервере.

1

Более простое решение - использовать команды find, grep и file, объединенные следующим образом:

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

Сначала вы найдете все файлы и передадите имя каждого в оболочку, которая сначала проверит его тип файла и, если будет найдено, что он имеет текстовый тип, попытается найти в нем строку 2013-07-29 , выплевывая имя файла, если и только (опция -l) найдена.

Это будет медленный бизнес, а пока принеси себе кофе.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .