Войти без запуска 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, если соответствующие службы включены на хосте;

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

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

larsks
источник
4
«Предположим, у вас нет физического доступа к компьютеру, и это единственная учетная запись пользователя с возможностью входа в ssh».
Деннис Уильямсон
Я иду по этому маршруту. Я опубликую решение после того, как найду его. К счастью, у меня есть несколько направлений атаки.
Том Риттер
1
использовал Filezilla для SFTP на моем сервере, и это исправило меня. Большое спасибо, ты спас меня. В моем файле .bash_profile возникло условие «выход 1», и оно меня задело.
Джангофан
118

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

user60069
источник
Это работает хорошо - просто и предоставляет оболочку, которую вы можете использовать для решения проблемы.
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 не был прочитан, и я смог изменить его.

miyashin
источник
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просто запускает вашу оболочку.

Tobu
источник
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, то с

user161180
источник
1
Это ctrl-v и ctrl-c в моей системе. Спасибо, в любом случае! :)
mzuther
2
ssh -t user@host "bash --norc --noprofile -c '/bin/rm .bashrc'"
wytten
источник
Это работало для меня в очень ограниченных условиях, когда ничего не получалось. Мне пришлось указать полный путь к .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.

Лоран Etiemble
источник
Если я (гипотетически) не запомнил структуру каталогов неправильно, и это не дает мне ошибку, это не работает - scp также запускает файл (ы).
Том Риттер
1
То, что люди не осознают, это то, что scp не является чем-то особенным; это просто еще одна команда, запускаемая через ssh - это означает, что почти все, что происходит с интерактивным ssh-сеансом, также полезно для scp.
Жаворонки
что насчет sftp, afaik - это ssh-подсистема.
Алло
0

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

ssh <hostname> rm ~/.bashrc
sybreon
источник
Проблема в файле .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

SpiesInOrbit
источник
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и отправить результат по почте?

lorenzog
источник