Что такое содержимое / bin / bash, и что мне делать, если я случайно перезаписал их

24

Я случайно переписал файл / bin / bash тупым скриптом, который я намеревался поместить в папку / bin.

Как мне вернуть содержимое этого файла? Есть ли способ найти содержимое в Интернете и просто скопировать его обратно? Какие у меня есть варианты, учитывая, что терминал выдает ошибку, говоря о «слишком много символических ссылок»?

Я все еще новичок в подобных вещах, и я ценю всю помощь, которую я могу получить.

Изменить: я забыл упомянуть, что я на Кали 2.2 Rolling, который в значительной степени Debian с некоторыми дополнительными функциями.

Редактировать 2: Я также перезапустил машину, так как я не осознал свою ошибку несколько дней назад. Это делает это немного сложнее.

GarrukApex
источник
9
Удалил баш? Просто используйте zsh :-) </ troll>
Кевин
1
serverfault.com/questions/451528/… и несколько других
skandigraun
физический или ВМ?
Бен
9
В следующий раз: не кладите вещи в системные каталоги . Если вам нужны нестандартные сценарии и прочее, либо создайте себе a $HOME/.binи добавьте его в свой каталог, PATHлибо используйте, /usr/local/binесли он вам нужен для всей системы. Или, что еще лучше, создайте пакет.
spectras

Ответы:

33

bashэто оболочка, вероятно, ваша системная оболочка, так что теперь происходят странные вещи, пока части оболочки все еще находятся в памяти. После того, как вы выйдете из системы или перезагрузитесь, у вас будут более серьезные проблемы.

Поэтому первым делом следует изменить оболочку на что-нибудь безопасное. Посмотрите, какие оболочки вы установили

cat /etc/shells

Затем измените вашу оболочку на одну из других оболочек, перечисленных там, например

chsh -s /bin/dash

Обновите, потому что вы уже перезагрузили:

Вам повезло, что в настоящее время процесс загрузки не зависит bash, поэтому ваша система загружается, вы просто не можете получить командную строку. Но вы можете запустить редактор для редактирования /etc/passwdи изменения оболочки в rootстроке с /bin/bashна /bin/dash. Выйдите и войдите снова. Просто не вносите никаких изменений в этот файл, иначе вы можете полностью испортить вашу систему.

Затем попробуйте переустановить bashс

apt-get --reinstall install bash

Если все удалось, вы можете chshвернуться к bash.

Наконец: я думаю, что kali - это узкоспециализированный дистрибутив, вероятно, не подходящий для людей, которые случайно перезаписывают свою оболочку. Поскольку это предложение называлось грубым и грубым, я должен добавить, что я написал это на собственном опыте. Когда я был моложе, я разрушил свою систему, потому что никто не сказал мне избегать возиться как root.

Philippos
источник
3
@ dr01: Учитывая, как работает bash escape, это может быть неуместной цитатой. Думай command > /bin/bash ...против command > (/bin/bash ...).
MSalters
7
Последнее предложение было суровым ... :)
Джеймс восстановил Монику Полк
6
@MSalters Неуместная цитата запускается как root . Это две ошибки. Во-вторых, конечно, пробовать ваши сложные конвейеры как root, а не как непривилегированный пользователь.
Дероберт
12
@JamesKPolk нет, это совсем не резко. Это простая истина. Кали - это профессиональный инструмент, разработанный для экспертов . Они даже заявляют об этом на своей веб-странице. Если вы не эксперт, вы действительно не имеете права управлять Кали.
Terdon
3
Последнее предложение не сурово. Это простая истина.
Андреа
65

Не выключайте свою машину.

У вас все еще есть работающая оболочка? Это Баш? Если так, ты в порядке. (Но не делайте этого снова.)

Бег:

sudo cp /proc/$$/exe /bin/bash

Вуаля, все хорошо.


Так как кто-то в комментариях сомневается, что это работает:

[vagrant@localhost ~]$ cat /etc/shells 
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
[vagrant@localhost ~]$ grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[vagrant@localhost ~]$ echo $0
-bash
[vagrant@localhost ~]$ sudo rm /bin/bash
[vagrant@localhost ~]$ bash
-bash: /bin/bash: No such file or directory
[vagrant@localhost ~]$ sudo su -
su: /bin/bash: No such file or directory
[vagrant@localhost ~]$ sudo cp /proc/$$/exe /bin/bash
[vagrant@localhost ~]$ bash
[vagrant@localhost ~]$ exit
[vagrant@localhost ~]$ sudo su -
[root@localhost ~]# logout
[vagrant@localhost ~]$ 
Wildcard
источник
18
В любом случае после этого рекомендуется переустановить bash из вашего дистрибутива, например, для получения правильных разрешений (некоторые охотники за руткитами могут удивиться там изменениям), а также для восстановления жесткой ссылки или символической ссылки (например, /bin/shили rbash)
Giacomo Catenazzi
4
@GiacomoCatenazzi, на самом деле, этот метод сохраняет права доступа - это по умолчанию при rootзапуске cp. Жесткие ссылки - это хороший момент.
Wildcard
1
Машина была перезапущена. Я не могу открыть нормальную оболочку, но я могу редактировать содержимое через графический интерфейс. Как сказано выше, я получаю сообщение об ошибке «Не удалось выполнить дочерний процесс / bin / bash. (Слишком много уровней символических ссылок)».
GarrukApex
5

Если вы можете войти в систему, но не можете открыть терминал или иным образом получить доступ к оболочке, но вы можете получить доступ к файлам через графический интерфейс пользователя, перейдите к /binпоиску файлов, имена которых заканчиваются sh(но не .sh), и запустите один (двойным щелчком мыши). или щелкнув правой кнопкой мыши). В частности, обратите внимание на следующее:

  • sh
  • dash
  • ash
  • ksh (или kshпосле номера; например,  ksh93)
  • zsh
  • yash

или, в крайнем случае,

  • tcsh или
  • csh

Если вы можете запустить оболочку, попробуйте ответ Филиппоса .

Другой подход заключается в загрузке в однопользовательском режиме, следуя этим инструкциям, но init=/bin/shвместо него укажите (или одну из других оболочек) init=/bin/bash.

Скотт
источник