Я облажался, выход в .bashrc


27

Я положил "выход" в моем файле .bashrc. У меня нет физического доступа к машине, поэтому для подключения к ней я использую ssh. У меня нет привилегий root. Каждый раз, когда я подключаюсь к серверу, соединение автоматически закрывается.

Пока что я пробовал:

  • Перезапись .bashrc с помощью scp и sftp. Соединение закрывается, прежде чем я могу что-либо сделать.
  • Использование нескольких различных программ GUI для доступа к SSH (соединение закрывается)
  • Перезаписываем файл с помощью ftp. (не могу использовать ftp)
  • С моего домашнего компьютера
    • $ ssh host "bash --noprofile --norc" (соединение закрывается)
    • $ ssh host "mv .bashrc bashrc_temp" (соединение закрывается)
    • $ ssh host "rm .bashrc" (тоже самое)
    • $ ssh host -t (соединение закрывается)

Могу ли я что-нибудь сделать, чтобы отключить .bashrc, или, возможно, перезаписать файл перед тем, как будет получен .bashrc?

ОБНОВИТЬ

@ ring0

Я попробовал ваше предложение, но не повезло. Файл bashrc все еще выполняется первым.

Еще я попробовал войти в систему с другой учетной записью и отредактировать sudo .bashrc, но у меня нет привилегий sudo для этой учетной записи.

Я думаю, я свяжусь с администратором.

РЕДАКТИРОВАТЬ

@shellholic

Я не могу в это поверить, но этот подход сработал! Несмотря на то, что «выход» происходит в первых нескольких строках (состоящих только из нескольких блоков if и операторов экспорта ) в файле .bashrc, мне все же удалось успешно прервать его с помощью Ctrl-c за двадцать попыток (это заняло около 3 минут). Я удалил оскорбительную строку в .bashrc и все снова в рабочем состоянии.


2
darwinawards.com у вас должен быть (временный) доступ как пользователь, который может перезаписать ваш файл .bashrc или изменить оболочку по умолчанию на что-то другое. «Спросите своего системного администратора», как говорит MS.

2
man 8 sshdговорит, что это 9. Runs user's shell or command.девятый шаг ...: - /

1
scp также перестанет работать, потому что оболочка все еще открывается и вызывается .bashrc
Александр Левчук

Кстати, большинство этих предложений не работает, потому что ssh выполняет любую команду, передавая ее в качестве аргумента в оболочку пользователя. Ищите execve в session.c. Нет никакого способа изменить / добавить / удалить аргументы этого вызова оболочки пользователя.
Марк Вагнер

Ответы:


37

Вы можете попытаться прервать выполнение (Ctrl + C) до того, как будет выполнена выходная часть .bashrc.

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

sleep 3
echo "Too late... bye"
exit 0

8
+1, потому что это, вероятно, единственное решение, которое не требует помощи системного администратора. Однако для правильной синхронизации требуется большая удача (хост ssh -v может немного помочь).
JooMing

На самом деле Ctrl + C работал. Даже без сна. Я поместил «выход» в мой bashrc и смог восстановить с помощью быстрых Ctrl + C после примерно 4 попыток. Пожалуйста, отредактируйте ответ, чтобы я мог изменить «-1» на «+1».
Александр Левчук

@ Александр Левчук готов
шеллхолик

4
Я очень ценю сочетание патетически нелепой низкотехнологичной и жестокой эффективности.
unixtippse

1
Я смеюсь как сумасшедший, тот порыв, когда это наконец работает. Спасибо @JooMing, я попробовал все методы отсюда serverfault.com/questions/94503/… даже тот, который нажимал Ctrl + C, но он работал только после добавления опции -v!
mxmlnkn

12

Мне также удалось испортить мой файл .bashrc на новом кластере, к которому мне предоставили пробный доступ. Не желая казаться нубом, последнее, что я хотел сделать, это попросить помощи у администраторов, и я не мог заставить работать своевременную ^ + C.
Однако, что сработало, так это отправка команды 'rm' в качестве последнего аргумента ssh. т.е.

ssh -tv user@host rm .bashrc

Я не смог заставить работать команду 'mv' (пробовал раньше без -t), поэтому я думаю, что опция -t должна была это сделать, но вы можете проверить это, если хотите. Теперь я извлек из файла .bashrc ~ (сделанного vim) все, кроме сомнительной строки, и все в мире правильно! = D


2
ssh -tv user@home mv .bashrc .bashrc-oldработал для меня
Code Commander

3

Если вы можете войти как другой пользователь, попробуйте это:

su user -s /bin/sh

Вам понадобится ваш пароль, конечно.


1
Вы можете попробовать другую, не основанную на sh оболочку: kshилиcsh
Hubert Kario

3

Если я вспоминаю некоторые неудачные события, которые у меня были, вот так, похоже, что ssh, scp, sftp запускают файлы инициализации.

Я предлагаю использовать простой FTP, а затем удалить или переименовать плохой файл в командной строке FTP после входа в систему. Я предполагаю, что ваша система разрешит вам доступ по FTP. В таком случае обязательно смените свой пароль (надежно) после завершения ремонта.


Filezilla отлично сработала для этого. Достаточно просто раскрыть меню «Сервер» и выбрать параметр «Принудительно показывать скрытые файлы».
Дэнни Дж.

1

С man ssh(по OpenSSH_5.6p1крайней мере, не уверен, когда он был добавлен),

~/.ssh/rc
        Commands in this file are executed by ssh when the user logs in, just
        before the user's shell (or command) is started.  See the sshd(8) manual
        page for more information.

..что означает, что вы можете создать, ~/.ssh/rcсодержащий следующее:

mv ~/.bashrc ~/bak.bashrc

Затем, когда вы sshвойдете, проблемный bashrc будет удален, прежде чем ваша оболочка входа в систему - тогда вы можете, очевидно, исправить bak.bashrcи переместить его обратно на место


0

Подключитесь через SCP или SFTP и отредактируйте / переименуйте / удалите файл .bashrc таким образом. Edit - D'oh, я вижу, вы сказали, что пытались это. Ну что ж.


0

У меня была такая же проблема, и я как-то смог ее решить. Я использовал ssh для доступа к системе, нажимал и удерживал Ctrl + c, как только вошел в систему. Затем ~ / .bashrc не был прочитан, и я смог изменить его.


1
Точный дубликат самого одобренного ответа здесь
pauska

0

Я нашел это работает.

Чтобы прервать загрузчик grub, нажмите e ... снова нажмите e, чтобы ввести строки загрузки grub, снова нажмите e, чтобы отредактировать строку ядра,

перейти к концу строки;

добавить init = / bin / bash в конце строки,

введите, чтобы вернуться, б, чтобы загрузить,

он откроет оболочку bash, откроет vim /root/.bashrc и отредактирует соответственно. выйти, и теперь вы сможете войти


0

Если вы используете Homestead Vagrant ...

Вот как я вытащил себя из этого рассола.

(Использование Git Bash в Windows 10)

cd ../Homestead/
mv ~/.ssh/known_hosts ~/.ssh/known_hosts_OLD
ssh vagrant@127.0.0.1 -p 2222 mv ./.bashrc ./.bashrc_OLD

Примечание: пароль по умолчанию "vagrant"

Эти статьи помогли мне:


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.