Masuk tanpa menjalankan bash_profile atau bashrc

75

Jadi katakanlah salah ketik sesuatu di dalamnya .bashrcyang mencegahnya masuk melalui ssh(yaitu ssh login keluar karena kesalahan dalam file). Apakah ada cara orang itu bisa login tanpa mengeksekusinya (atau .bashrckarena yang satu menjalankan yang lain), atau menghapus / mengganti nama / membatalkan file?

Misalkan Anda tidak memiliki akses fisik ke mesin, dan ini adalah satu-satunya akun pengguna dengan kemampuan ssh in.

Untuk Referensi: .bash_profiletermasuk .bashrc:

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

Sunting: Hal-hal yang telah saya coba:

ssh user@host "rm ~/.bashrc"

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

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

Semua memberi kesalahan:

/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
Tom Ritter
sumber
4
Perintah scp Anda tidak akan berfungsi karena scp juga akan membaca .bashrc saat menghubungkan. Untuk menghindari masalah Di masa mendatang, Anda dapat menambahkan sesuatu seperti [ -z "$PS1" ] && returndi awal ./bashrc. Dengan cara ini scp akan berhenti mem-parsing .bashrc setelah baris pertama, dan Anda akan bisa menimpanya jika terjadi keadaan darurat.
dalloliogm

Jawaban:

24

Saya pikir satu-satunya pilihan Anda adalah:

  • ssh sebagai pengguna lain dan su ke akun Anda;

  • gunakan sesuatu seperti ftp atau smbclient, jika layanan yang relevan diaktifkan pada host;

  • temukan kerentanan terbuka di layanan jaringan terbuka dan manfaatkan :).

  • dapatkan admin untuk memperbaiki masalah.

larsks
sumber
4
"Misalkan kamu tidak memiliki akses fisik ke mesin, dan ini adalah satu-satunya akun pengguna dengan kemampuan ssh."
Dennis Williamson
Saya akan melalui rute ini. Saya akan memposting solusi setelah saya menemukannya. Untungnya, saya memiliki beberapa jalan serangan.
Tom Ritter
1
Filezilla digunakan untuk SFTP ke server saya dan itu memperbaiki saya. Terima kasih banyak, Anda menyelamatkan saya. Saya memiliki kondisi "keluar 1" di .bash_profile saya secara tidak sengaja dan itu membuat saya terpesona.
djangofan
117

ssh -t username@hostname /bin/sh bekerja untukku.

pengguna60069
sumber
Ini berfungsi dengan baik - sederhana dan menyediakan shell yang dapat Anda gunakan untuk memperbaiki masalah.
MT.
1
Mencoba melakukan ini dengan aplikasi Secure Shell di Google Chrome ( chrome.google.com/webstore/detail/secure-shell/… ) tetapi tidak dapat mengetahui bagaimana / di mana harus meletakkan argumen baris perintah. Ada tips?
Benj
2
Ini tidak berfungsi untuk saya (meskipun harus sesuai dengan halaman manual). Host lokal menjalankan ubuntu 14.04.1 dan itu adalah ubuntu 12.04.5 pada host jarak jauh. Saya tidak dapat melakukan rsync karena shell login saya adalah tcsh dan pada host jarak jauh ia mencetak sampah (tcsh: Tidak ada file atau direktori tcsh: Mencoba memulai dari "/ u / retribusi" - yang saya katakan karena direktori sudah terpasang NSF). Saya pikir saya akan memecahkan masalah melewati shell login tetapi itu tidak berhasil.
Silvio Levy
2
Jika shell default Anda adalah csh / tcsh, shell itu akan selalu sumber .cshrc/ .tcshrcbahkan untuk shell yang tidak interaktif.
Brian Vandenberg
Aku duduk di sini tertawa terbahak-bahak pada kebodohanku sendiri untuk sampai ke titik ini. Solusi Anda bekerja sangat baik. Terima kasih banyak karena telah membantu
manajer ini
36

Saya memiliki masalah yang sama, dan entah bagaimana bisa menyelesaikannya. Saya menggunakan ssh untuk mengakses sistem, dan menekan dan menahan Ctrl + c segera setelah saya masuk ke sistem. Kemudian, ~ / .bashrc tidak dibaca, dan saya dapat memodifikasinya.

miyashin
sumber
11
Saya skeptis, tetapi ini benar-benar berfungsi ...
rmobi
Ini jenius!
user1747134
Sebenarnya berhasil ... terima kasih! Metode lain tidak pernah berhasil untuk saya.
Zzzach ...
pada mac dengan hanya .bash_profile, ini bekerja untuk saya :)
AnneTheAgile
OMG, saya pikir saya telah mencari di seluruh internet, lalu saya memutuskan untuk mencoba ini, dan ini adalah satu-satunya cara yang bekerja untuk saya! Terima kasih!
Jiahao Cai
21

Saya menggunakan CVE yang diterbitkan untuk menjalankan perintah sebagai root melalui antarmuka web dalam perangkat lunak pemantauan jaringan yang telah saya instal. rm /RAID/home/tom/.bashrc

Kemudian saya bisa login dan svn mengembalikan perubahan yang saya buat.

Tom Ritter
sumber
11
Itu luar biasa dan juga gagal pada saat bersamaan.
MikeyB
1
@ TomRitter: Harap berikan referensi ᴄᴠᴇ itu.
user2284570
1
Itu dalam versi kaktus oooold, jadi kecuali Anda menjalankan perangkat lunak berusia 8 tahun saya tidak berpikir itu akan membantu Anda. Dan jika Anda menjalankan perangkat lunak berusia 8 tahun, saya tidak dapat membantu Anda. ;)
Tom Ritter
15

Anda perlu a) memulai pesta tanpa source'ing baik ~/.bashrcatau ~/.bash_profiledan b) karena shell tersebut tidak akan menjadi shell login penuh / telah ada tty terpasang, kekuatan ssh untuk melampirkan tty :

ssh -t user@host bash --norc --noprofile
Christian Krause
sumber
3
Ini berfungsi, tetapi perhatikan bahwa Anda tidak akan memiliki prompt seperti biasa, hanya layar kosong. coba lakukan lsuntuk meyakinkan diri sendiri bahwa Anda berada di :). Juga perhatikan ini akan menggunakan dumbistilah, jadi bagi saya nano tidak berfungsi
Ciprian Tomoiagă
7

Anda kurang beruntung.

Semua perintah ssh menjalankan shell login Anda. ssh $COMMANDmenjalankan $SHELL -c $COMMAND, scpmenjalankan $SHELL -c /path/to/sftp-server, sshhanya menjalankan shell Anda.

Tobu
sumber
3
Ini juga berlaku untuk sftp - bahkan subsistem SSH tampaknya dijalankan dari dalam shell.
lxgr
Dalam pengalaman saya Anda benar, meskipun halaman manual ssh mengatakan "Jika perintah ditentukan, itu dijalankan pada host jarak jauh, bukan shell login." Namun poster tersebut mampu menyelesaikan masalah menggunakan jawaban dengan nilai tertinggi (ssh hostname / bin / sh). Apa yang menyebabkannya?
Silvio Levy
@ Silvio, jawaban OP adalah bahwa ia menggunakan exploit yang tidak terkait dengan SSH.
Tobu
Baik. Seseorang melaporkan kesuksesan dengan jawaban berperingkat tertinggi dan saya dengan cepat berasumsi itu adalah OP. Saya berharap itu berhasil - Saya memiliki situasi yang sama, meskipun itu hanya mengganggu tidak melumpuhkan. (Lihat komentar saya di bawah jawaban dengan nilai tertinggi di atas.)
Silvio Levy
6

Tidak ada jawaban di atas yang dapat melewati shell login ssh. Anda dapat melewati baris perintah penuh, dan itu menjalankan shell jauh untuk memproses perintah dan mengatur lingkungan kerja untuk perintah. Itulah gunanya shell dan itu adalah cara Unix. Anda akan memiliki segala macam masalah kompatibilitas jika Anda mencoba menjalankan sesuatu tanpa shell. Demikian juga, mencoba kontrol-C harus melakukan hal yang sama seperti memanggil keluar yang merupakan perilaku yang Anda coba hindari. Jika bash melanjutkan bugnya. Mengapa orang terus mengatakan bahwa halaman manual mengatakan sesuatu yang berbeda perlu mengutipnya karena itu tidak mengatakan hal semacam itu di halaman manual saya.

Selain itu, pada kebanyakan sistem linux, menentukan / bin / sh TIDAK ADA karena ini hanya symlink ke bash!

Mau tes? Tambahkan pernyataan "echo" untuk Anda .bashrc dan .profile dan lihat mana yang dijalankan. Aku melakukannya. Inilah hasilnya.

ssh user@hostakan mengeksekusi .bash_profile ssh user@host /bin/bashakan mengeksekusi .bashrc, tetapi menurutnya non-interaktif (tanpa prompt). ssh -t user@host /bin/bashmengeksekusi .bashrc dua kali ... sekali saat login, sekali untuk perintah yang lewat, jadi menentukan shell APAPUN akan selalu menjalankan yang pertama. ssh -T user@hostsama dengan tidak menentukan -T atau -t sama sekali.

Sekarang, jika Anda perhatikan, sistem MY tidak menjalankan kedua file, hanya satu atau yang lain. Tetapi poster asli memiliki garis dalam .bash_profile menjalankan .bashrc, jadi .bashrc akan selalu dijalankan tidak peduli apa pun. Seharusnya tidak meletakkan garis itu di sana! Jika garis itu tidak ada, Anda tidak akan memiliki masalah.

Anda harus mencari cara lain atau mencari admin. Untuk inilah admin.

Evan Langlois
sumber
Beberapa poin bagus; tidak ada eksekusi yang dapat dieksekusi karena perintah dapat membantu, seperti yang Anda jelaskan, tetapi pada titik yang agak diperdebatkan: jika /bin/sh memang bisa dieksekusi terlebih dahulu, itu akan membantu, karena Bash tidak memuat ~/.bashrcketika dipanggil sebagai sh. Jawaban ini adalah superset dari jawaban Anda yang lain, jadi harap hapus yang lain.
mklement
3

Sesuatu seperti:

ssh host "/bin/bash --norc"

yang tampaknya berfungsi, tetapi perhatikan bahwa PS1 tidak diatur sehingga Anda akan mengetik perintah tanpa prompt.

Ini memiliki keuntungan karena tidak merusak.

Dennis Williamson
sumber
1
Ini tidak bekerja, ia mencoba untuk berhasil login pertama, tetapi tidak bisa masuk, dan karena itu tidak dapat menjalankan bash --norc
Tom Ritter
2

mencoba

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

^ C ada control-v maka c

pengguna161180
sumber
1
Ini ctrl-v dan ctrl-c di sistem saya. Bagaimanapun, terima kasih! :)
mzuther
2
ssh -t user@host "bash --norc --noprofile -c '/bin/rm .bashrc'"
wytten
sumber
Ini bekerja untuk saya di lingkungan yang sangat terbatas ketika tidak ada yang mau. Saya harus menentukan path lengkap ke .bashrc.
zbeekman
1

Menghancurkan ctrl-C berfungsi selama Anda bisa mendapatkan ctrl-C sebelum .bashrc keluar. Sayangnya, ini bisa sulit dilakukan jika exitmasih awal di .bashrc.

Anda dapat memasukkan ctrl-C sesegera mungkin dengan mem-pipkannya ke ssh secara langsung:

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

Catatan yang ^Cdiketik seperti ctrl-V diikuti oleh ctrl-C.

Ini memipakan ctrl-C tunggal diikuti oleh input dari terminal pengendali, sementara -ttmemaksa terminal psuedo dialokasikan. Semua mengatakan ini memberi Anda shell (agak cacat) pada mesin jarak jauh sambil melewati sebanyak .bashrc mungkin.

Chris
sumber
0

Anda dapat mencoba menimpa .bash_profilefile kosong menggunakan scpperintah. Dari apa yang saya googled, scp menggunakan login non-interaktif yang tidak dibaca .bash_profile.

Laurent Etiemble
sumber
Kecuali saya (secara hipotesis) mengingat struktur direktori yang salah, dan itu tidak memberi saya kesalahan tentang itu, ini tidak berfungsi - scp juga menjalankan file.
Tom Ritter
1
Hal yang tidak disadari orang adalah scp bukanlah sesuatu yang istimewa; itu hanyalah perintah lain yang dijalankan ssh - yang berarti hampir semua yang terjadi untuk sesi ssh interaktif dengan scp, juga.
larsks
bagaimana dengan sftp, afaik sebuah subsistem ssh.
allo
0

Anda juga dapat menghapus file bashrc:

ssh <hostname> rm ~/.bashrc
sybreon
sumber
Masalahnya ada di file .bash_profile, bukan di bashrc.
Laurent Etiemble
1
Ini tidak berhasil - ia mencoba shell terlebih dahulu dan gagal.
Tom Ritter
0

Jika sistem Anda diatur secara normal, .bash_profile tidak akan dijalankan untuk shell non-interaktif (seperti menjalankan perintah).

Karena Anda menyatakan masalahnya ada di file .bash_profile, cobalah memindahkannya:

ssh user@host "mv ~/.bash_profile ~/.bash_profile_broken"
Lockie
sumber
Saya tidak berpikir seperti file dikaitkan penting yang - .bash_profile termasuk .bashrc = (saya menambahkan info lebih lanjut.
Tom Ritter
1
Tapi apa yang disarankan Lockie - yang dikonfirmasi oleh halaman bash man - adalah bahwa shell non-interaktif tidak akan berjalan .bashrc atau .bash_profile. Namun, bahkan ketika Anda memberikan perintah pada baris perintah ssh (seperti dalam contoh ini), bash masih dimulai sebagai shell "interaktif", yang berarti ia akan membaca file .bashrc Anda. Jadi ide yang bagus, tapi sayangnya ssh tidak mau bekerja sama.
larsks
0

UH = 'user @ host'; ssh $ UH 'mv ~ / .bashrc ~ / letmein'; ssh $ UH

Tolong jangan potong dan jalankan, ubah userdan host, kemudian edit letmeindan simpan sebagai.bashrc

SpiesInOrbit
sumber
0

Kudos to user60069, ini berhasil untuk saya, tapi saya menggunakan file startup shell khusus .bashrc, jadi masuk dengan / bin / sh bekerja untuk saya.

Namun, jika Anda berada dalam situasi "tidak beruntung", saya menawarkan solusi ini, berdasarkan pada solusi user60069 dan Dennis W:

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

Dennis W menawarkan opsi --norc, yang menurut seseorang tidak bekerja untuk mereka.

Jalankan "man bash" atau "man (shell Anda)" untuk opsi untuk menonaktifkan file start up. Anda hanya perlu menggunakan shell yang menjijikkan untuk waktu yang dibutuhkan untuk memperbaiki masalah.

Jim
sumber
0

Cara lain untuk masuk ke server adalah tanpa profil, silakan temukan perintah di bawah ini
ssh -t user@host bash --noprofile

Untuk AWS menggunakan file pem dan tidak ada pengguna lain
ssh -ti "YOUR-PEM-FILE-NAME.pem" ec2-user@YOUR-IP-ADDRESS bash --noprofile

Semoga ini membantu!

Krutarth Shah
sumber
-1

Dari saran dan tanggapan yang diberikan di atas, saya akan mengatakan itu bukan file .bashrc atau .bash_profile. Juga ssh manpage mengatakan bahwa jika Anda menentukan perintah yang akan dieksekusi maka file profil Anda tidak akan dibaca.

Saya sarankan mencoba mengeksekusi shell login yang berbeda (ksh? Csh? Sh?) Dari path absolut; juga, berhati-hatilah bahwa itu mungkin masalah yang sama sekali berbeda (kuota? jalankan dan baca izin pada direktori home Anda?), jadi pendekatan sampingan akan lebih baik. Bisakah Anda meminta pengguna lain untuk melakukan ls -la $YOUR_HOME_DIRdan mengirimkan hasilnya kepada Anda?

lorenzog
sumber