Войти без запуска bash_profile или bashrc


75

Итак, скажем, кто-то опечатал что-то в их, .bashrcчто мешает ему (или ей) войти в систему через ssh(то есть, вход по ssh завершается из-за ошибки в файле). Есть ли способ, которым этот человек мог войти в систему, не выполняя его (или .bashrcпоскольку один запускает другой), или иным образом удалить / переименовать / сделать недействительным файл?

Предположим, у вас нет физического доступа к компьютеру, и это единственная учетная запись пользователя с возможностью входа по ssh.

Для справки: .bash_profileвключает в себя .bashrc:

[[ -f ~/.bashrc ]] && . ~/.bashrc

Изменить: вещи, которые я пытался:

ssh user@host "rm ~/.bashrc"

scp nothing user@host:/RAID/home/tom/.bashrc

ssh user@host  "/bin/bash --norc"

Все выдают ошибку:

/RAID/home/tom/.bashrc: line 16: /usr/local/bin/file: No such file or directory
/RAID/home/tom/.bashrc: line 16: exec: /usr/local/bin/file: cannot execute: No such file or directory

4
Ваша команда scp не будет работать, потому что scp также будет читать .bashrc при подключении. Чтобы избежать проблемы В будущем вы можете добавить что-то вроде [ -z "$PS1" ] && returnв начале ./bashrc. Таким образом, scp прекратит синтаксический анализ .bashrc после первой строки, и вы сможете перезаписать его в случае необходимости.
— dalloliogm

Ответы:


24

Я думаю, что ваши единственные варианты:

  • ssh в качестве другого пользователя и su для вашей учетной записи;

  • используйте что-то вроде ftp или smbclient, если соответствующие службы включены на хосте;

  • найти открытую уязвимость в открытом сетевом сервисе и использовать ее :).

  • получить администратора, чтобы решить проблему.


4
«Предположим, у вас нет физического доступа к компьютеру, и это единственная учетная запись пользователя с возможностью входа в ssh».
— Деннис Уильямсон

Я иду по этому маршруту. Я опубликую решение после того, как найду его. К счастью, у меня есть несколько направлений атаки.
— Том Риттер

1
использовал Filezilla для SFTP на моем сервере, и это исправило меня. Большое спасибо, ты спас меня. В моем файле .bash_profile возникло условие «выход 1», и оно меня задело.
— Джангофан

118

ssh -t username@hostname /bin/sh работает для меня.


Это работает хорошо - просто и предоставляет оболочку, которую вы можете использовать для решения проблемы.
— MT.

1
Попытка сделать это с помощью приложения Secure Shell в Google Chrome ( chrome.google.com/webstore/detail/secure-shell/… ), но не может понять, как / где разместить аргументы командной строки. Какие-нибудь советы?
— Бендж

2
Это не работает для меня (хотя это должно быть в соответствии со страницей руководства). Локальный хост запускает Ubuntu 14.04.1 и это Ubuntu 12.04.5 на удаленном хосте. Я не могу выполнить rsync, потому что моя оболочка входа в систему - tcsh, и на удаленном хосте она печатает мусор (tcsh: нет такого файла или каталога, tcsh: пытается начать с «/ u / levy» - что мне говорят, потому что каталог смонтирован NSF). Я думал, что решу проблему, минуя оболочку входа в систему, но это не работает.
— Сильвио Леви,

2
Если ваша оболочка по умолчанию - csh / tcsh, то она всегда будет источником .cshrc/ .tcshrcдаже для неинтерактивных оболочек.
— Брайан Ванденберг

Я сижу здесь, смеясь над своей задницей из-за собственной глупости, чтобы добраться до этой точки. Ваше решение сработало отлично. Большое спасибо за то, что помогли этому тинкеру выполнить свою работу
— ijustlovemath

36

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


11
Я был скептиком, но это на самом деле работает ...
— rmobis

Это гений!
— user1747134

На самом деле работает ... спасибо! Другие методы никогда не работали для меня.
— Ззач ...

на Mac только с .bash_profile, это работало для меня :)
— AnneTheAgile

OMG, я думал, что искал весь интернет, затем я решил попробовать это, и это единственный способ, который работает для меня! Спасибо!
— Цзяхао Цай

21

Я использовал опубликованный CVE для выполнения команды от имени пользователя root через веб-интерфейс в программном обеспечении для мониторинга сети, которое я установил. rm /RAID/home/tom/.bashrc

Затем я мог войти в систему и SVN отменить изменения, которые я сделал.


11
Это одновременно и потрясающе, и неудачно.
— MikeyB

1
@ TomRitter: Пожалуйста, предоставьте эту ᴄᴠᴇ ссылку.
— user2284570

1
Это было в oooold версии cacti, поэтому, если вы не используете 8-летнее программное обеспечение, я не думаю, что оно вам поможет. И если у вас 8-летнее программное обеспечение, я не могу вам помочь. ;)
— Том Риттер

15

Вам необходимо a) запустить bash без использования sourceлибо ~/.bashrcили, ~/.bash_profileи b) поскольку такая оболочка не будет полноценной оболочкой для входа в систему / без tty , заставьте ssh присоединить tty :

ssh -t user@host bash --norc --noprofile

3
Это работает, но учтите, что у вас не будет обычного приглашения, только пустой экран. попробуйте сделать, lsчтобы убедить себя, что вы в :). Также обратите внимание, что здесь будет использоваться dumbтермин, поэтому для меня nano не работает
— Ciprian Tomoiagă

7

Не повезло тебе.

Все команды ssh запускают вашу оболочку входа в систему. ssh $COMMANDработает $SHELL -c $COMMAND, scpработает $SHELL -c /path/to/sftp-server, sshпросто запускает вашу оболочку.


3
Это также верно для sftp - даже подсистемы SSH, очевидно, выполняются изнутри оболочки.
— lxgr

По моему опыту, вы правы, хотя на странице ssh man написано: «Если указана команда, она выполняется на удаленном хосте вместо оболочки входа в систему». Тем не менее, постер смог решить проблему, используя самый высокий рейтинг ответа (ssh hostname / bin / sh). Что дает?
— Сильвио Леви,

@ Silvio, OP отвечает, что он использовал эксплойт, не связанный с SSH.
— Тобу

Правильно. Кто-то сообщил об успехе с самым высоким рейтингом ответа, и я поспешно предположил, что это был ОП. Хотелось бы, чтобы это сработало - у меня похожая ситуация, хотя это просто раздражает, не калечит. (См. Мой комментарий под ответом с самым высоким рейтингом выше.)
— Сильвио Леви

6

Ни один из приведенных выше ответов не может обойти оболочку входа в систему ssh. Вы можете передать полную командную строку, и поэтому она запускает удаленную оболочку для обработки команды и установки рабочей среды для команды. Вот для чего нужны оболочки, и это путь Unix. У вас возникнут всевозможные проблемы совместимости, если вы попытаетесь запустить что-то без оболочки. Точно так же, попытка control-C должна делать то же самое, что и вызов exit, то есть поведение, которого вы пытаетесь избежать. Если Bash продолжает свою ошибку. Почему люди продолжают говорить, что на странице руководства написано что-то другое, нужно цитировать, потому что на моей странице руководства ничего подобного не сказано.

Кроме того, в большинстве систем linux указание / bin / sh НИЧЕГО не дает, поскольку это просто символическая ссылка на bash!

Хотите проверить? Добавьте операторы "echo" к вам .bashrc и .profile и посмотрите, какой из них запущен. Я сделал. Вот результаты.

ssh user@hostвыполнит .bash_profile ssh user@host /bin/bashвыполнит .bashrc, но считает, что он неинтерактивный (без приглашения). ssh -t user@host /bin/bashвыполняет .bashrc дважды ... один раз при входе в систему, один раз для переданной команды, поэтому указание ЛЮБОЙ оболочки всегда будет выполняться первым. ssh -T user@hostэто то же самое, что не указывать -T или -t вообще.

Теперь, если вы заметили, МОЯ система не запускает оба файла, только один или другой. Но у исходного постера есть строка в .bash_profile, в которой работает .bashrc, поэтому .bashrc всегда будет запускаться, несмотря ни на что. Не должен был поставить эту линию там! Если бы эта линия не существовала, у вас не было бы проблемы.

Вам нужно будет найти другой путь или найти администратора. Для этого и нужны админы.


Некоторые хорошие моменты; не исполняемый файл не передается как команда может помочь, как вы объяснить, но на несколько спорный вопрос: если /bin/sh действительно получить , чтобы выполнить первый, он будет помогать, потому что Bash не сработал , ~/.bashrcкогда вызывается как sh. Этот ответ является расширенным вариантом вашего другого ответа, поэтому, пожалуйста, удалите другой.
— Мклемент

3

Что-то вроде:

ssh host "/bin/bash --norc"

что, кажется, работает, но обратите внимание, что PS1 не установлен, поэтому вы будете вводить команды без приглашения.

Преимущество в том, что он не разрушителен.


1
Это не работает, сначала он попытался успешно войти, но не может войти, и поэтому не может запустить bash --norc
— Tom Ritter

2

пытаться

echo ^C | ssh <hostname> ' rm .bashrc'

^ C есть контроль-V, то с


1
Это ctrl-v и ctrl-c в моей системе. Спасибо, в любом случае! :)
— mzuther

2
ssh -t user@host "bash --norc --noprofile -c '/bin/rm .bashrc'"

Это работало для меня в очень ограниченных условиях, когда ничего не получалось. Мне пришлось указать полный путь к .bashrc.
— zbeekman

1

Mashing ctrl-C работает до тех пор, пока вы можете получить ctrl-C до выхода .bashrc. К сожалению, это может быть трудно сделать, если exitвы находитесь в начале .bashrc.

Вы можете вставить ctrl-C как можно скорее, отправив его напрямую в ssh:

{ echo ^C; cat /dev/tty; } | ssh -tt user@host

Обратите внимание, что ^Cнапечатано как Ctrl-V, а затем Ctrl-C.

Это передает один ctrl-C с последующим вводом от управляющего терминала, в то время -ttкак принудительно назначается псевдо-терминал. Все это дает вам (несколько искаженную) оболочку на удаленной машине, обходя как можно больше .bashrc.


0

Вы можете попробовать перезаписать .bash_profileпустой файл с помощью scpкоманды. Из того, что я гуглил, scp использует неинтерактивный логин, который не читает .bash_profile.


Если я (гипотетически) не запомнил структуру каталогов неправильно, и это не дает мне ошибку, это не работает - scp также запускает файл (ы).
— Том Риттер

1
То, что люди не осознают, это то, что scp не является чем-то особенным; это просто еще одна команда, запускаемая через ssh - это означает, что почти все, что происходит с интерактивным ssh-сеансом, также полезно для scp.
— Жаворонки

что насчет sftp, afaik - это ssh-подсистема.
— Алло

0

Вы также можете просто удалить файл bashrc:

ssh <hostname> rm ~/.bashrc

Проблема в файле .bash_profile, а не в bashrc.
— Лоран Etiemble

1
Это не работает - сначала он пытается найти оболочку и не работает.
— Том Риттер

0

Если ваша система настроена нормально, .bash_profile не будет запускаться для неинтерактивной оболочки (например, для запуска команды).

Поскольку вы заявляете, что проблема находится в файле .bash_profile, попробуйте убрать его с пути:

ssh user@host "mv ~/.bash_profile ~/.bash_profile_broken"

Я не думал, каким образом файлы были связаны, имеет значение - .bash_profile включает в себя .bashrc = (я добавил больше информации.
— Том Риттер

1
Но то, что предлагает Локки - что подтверждается справочной страницей bash - то, что неинтерактивная оболочка не будет запускать ни .bashrc, ни .bash_profile. Однако, даже когда вы передаете команды в командной строке ssh (как в этом примере), bash по-прежнему запускается как «интерактивная» оболочка, что означает, что она будет читать ваш файл .bashrc. Так что хорошая идея, но, к сожалению, ssh не будет сотрудничать.
— Жаворонки

0

UH = 'пользователь @ хост'; ssh $ UH 'mv ~ / .bashrc ~ / letmein'; ssh $ UH

Пожалуйста, не вырезайте и не запускайте, не изменяйте, userа hostзатем редактируйте letmeinи сохраняйте как.bashrc


0

Престижность для user60069, у меня это сработало, но я использую специфичный для оболочки загрузочный файл .bashrc, так что вход в систему с / bin / sh работал для меня.

Однако, если вы оказались в ситуации «нет такой удачи», я предлагаю это решение, основанное на решениях user60069 и Dennis W:

ssh -t you@host  /bin/bash --noprofile  --norc

Деннис В предложил вариант --norc, который, по словам кого-то, не работал для них.

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


0

Другой способ входа на сервер без профиля, пожалуйста, найдите ниже команду
ssh -t user@host bash --noprofile

Для AWS используется pem-файл, но нет другого пользователя
ssh -ti "YOUR-PEM-FILE-NAME.pem" ec2-user@YOUR-IP-ADDRESS bash --noprofile

Надеюсь это поможет!


-1

Из предложений и ответов, приведенных выше, я бы сказал, что это не файлы .bashrc или .bash_profile. Также ssh manpage говорит, что если вы укажете команду для выполнения, то файлы вашего профиля не будут прочитаны.

Я бы посоветовал попробовать выполнить другую оболочку входа в систему (ksh? Csh? Sh?) Из абсолютного пути; Кроме того, имейте в виду, что это может быть совершенно другая проблема (квота? выполнить и разрешение на чтение в вашем домашнем каталоге?), поэтому побочный подход был бы лучше. Можете ли вы попросить другого пользователя сделать ls -la $YOUR_HOME_DIRи отправить результат по почте?

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