Đăng nhập mà không cần chạy bash_profile hoặc bashrc


75

Vì vậy, giả sử một lỗi đánh máy một cái gì đó trong .bashrcđó ngăn anh ấy (hoặc cô ấy) đăng nhập thông qua ssh(tức là đăng nhập ssh thoát vì lỗi trong tệp). Có cách nào mà người đó có thể đăng nhập mà không thực hiện nó (hoặc .bashrcvì cái này chạy cái kia), hoặc nếu không thì xóa / đổi tên / làm mất hiệu lực tập tin?

Giả sử bạn không có quyền truy cập vật lý vào máy và đây là tài khoản người dùng duy nhất có khả năng ssh in.

Để tham khảo: .bash_profilebao gồm .bashrc:

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

Chỉnh sửa: Những điều tôi đã thử:

ssh user@host "rm ~/.bashrc"

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

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

Tất cả đưa ra lỗi:

/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
Lệnh scp của bạn sẽ không hoạt động vì scp cũng sẽ đọc .bashrc khi kết nối. Để tránh sự cố Trong tương lai, bạn có thể thêm một cái gì đó như [ -z "$PS1" ] && returnvào đầu ./bashrc. Bằng cách này, scp sẽ dừng phân tích cú pháp .bashrc sau dòng đầu tiên và bạn sẽ có thể ghi đè lên nó trong trường hợp khẩn cấp.
dalloliogm

Câu trả lời:


24

Tôi nghĩ lựa chọn duy nhất của bạn là:

  • ssh trong như một người dùng khác và su vào tài khoản của bạn;

  • sử dụng một cái gì đó như ftp hoặc smbclient, nếu các dịch vụ liên quan được bật trên máy chủ;

  • tìm một lỗ hổng mở trong một dịch vụ mạng mở và khai thác nó :).

  • có được một quản trị viên để khắc phục vấn đề.


4
"Giả sử bạn không có quyền truy cập vật lý vào máy và đây là tài khoản người dùng duy nhất có khả năng ssh."
Dennis Williamson

Tôi đang đi xuống tuyến đường này. Tôi sẽ đăng giải pháp sau khi tôi tìm thấy nó. Fortunetly, tôi có một vài con đường tấn công.
Tom Ritter

1
đã sử dụng Filezilla để SFTP vào máy chủ của tôi và nó đã sửa tôi. Cảm ơn rất nhiều, bạn đã cứu tôi. Tôi đã gặp tình trạng "thoát 1" trong .bash_profile của mình một cách tình cờ và nó đã hos tôi.
djangofan

117

ssh -t username@hostname /bin/sh làm việc cho tôi


Điều này hoạt động tốt - đơn giản và cung cấp một vỏ bạn có thể sử dụng để khắc phục vấn đề.
MT.

1
Cố gắng thực hiện điều này với ứng dụng Secure Shell trong Google Chrome ( chrome.google.com/webstore/detail/secure-shell/ ám ) nhưng không thể tìm ra cách / nơi để đặt các đối số dòng lệnh. Lời khuyên nào?
Benj

2
Điều này không làm việc cho tôi (mặc dù nó nên theo trang nam). Máy chủ cục bộ chạy Ubuntu 14.04.1 và đó là Ubuntu 12.04.5 trên máy chủ từ xa. Tôi không thể rsync vì shell đăng nhập của tôi là tcsh và trên máy chủ từ xa, nó in rác (tcsh: Không có tệp hoặc thư mục như vậy tcsh: Cố gắng bắt đầu từ "/ u / levy" - mà tôi đã nói là vì thư mục được gắn NSF). Tôi nghĩ tôi sẽ giải quyết vấn đề bỏ qua shell đăng nhập nhưng nó không hoạt động.
Silvio Levy

2
Nếu shell mặc định của bạn là csh / tcsh, nó sẽ luôn lấy nguồn .cshrc/ .tcshrcthậm chí cho các shell không tương tác.
Brian Vandenberg

Tôi đang ngồi đây cười khẩy vì sự ngu ngốc của chính mình để đi đến điểm này. Giải pháp của bạn đã làm việc tuyệt vời. Cảm ơn bạn rất nhiều vì đã giúp người sửa tin này hoàn thành công việc
ijustlovemath

36

Tôi đã có cùng một vấn đề, và bằng cách nào đó đã có thể giải quyết nó. Tôi đã sử dụng ssh để truy cập hệ thống, và nhấn và giữ Ctrl + c ngay khi tôi đăng nhập vào hệ thống. Sau đó, ~ / .bashrc không được đọc và tôi đã có thể sửa đổi nó.


11
Tôi đã hoài nghi, nhưng điều này thực sự hoạt động ...
rmobis

Đây là thiên tài!
dùng1747134

Thực sự hoạt động ... cảm ơn! Các phương pháp khác không bao giờ làm việc cho tôi.
Zzzach ...

trên mac chỉ với một .bash_profile, điều này hiệu quả với tôi :)
AnneTheAgile

OMG, tôi nghĩ rằng tôi đã tìm kiếm trên toàn bộ internet, sau đó tôi quyết định thử nó, và đây là cách duy nhất phù hợp với tôi! Cảm ơn!
Jiahao Cai

21

Tôi đã sử dụng CVE được xuất bản để thực thi lệnh dưới quyền root thông qua giao diện web trong phần mềm giám sát mạng mà tôi đã cài đặt. rm /RAID/home/tom/.bashrc

Sau đó tôi có thể đăng nhập và svn hoàn nguyên các thay đổi tôi đã thực hiện.


11
Đó là cả tuyệt vời và thất bại cùng một lúc.
MikeyB

1
@TomRitter: Vui lòng cung cấp tài liệu tham khảo.
dùng2284570

1
Đó là phiên bản ooactold, vì vậy trừ khi bạn chạy phần mềm 8 năm tuổi, tôi không nghĩ nó sẽ giúp bạn. Và nếu bạn đang chạy phần mềm 8 tuổi, tôi không thể giúp bạn. ;)
Tom Ritter

15

Bạn cần phải a) bắt đầu bash mà không source'ing hoặc ~/.bashrchoặc ~/.bash_profileb) vì shell đó sẽ không phải là shell đăng nhập đầy đủ / không có tty đính kèm, buộc ssh phải đính kèm tty :

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

3
Điều này hoạt động, nhưng lưu ý rằng bạn sẽ không có lời nhắc thông thường của bạn, chỉ là một màn hình trống. hãy thử làm một điều lsđể thuyết phục bản thân rằng bạn đang ở :). Cũng lưu ý rằng điều này sẽ sử dụng một dumbthuật ngữ, vì vậy đối với tôi, nano không hoạt động
Ciprian Tomoiagă

7

Bạn đã hết may mắn.

Tất cả các lệnh ssh chạy shell đăng nhập của bạn. ssh $COMMANDchạy $SHELL -c $COMMAND, scpchạy $SHELL -c /path/to/sftp-server, đồng bằng sshchỉ chạy vỏ của bạn.


3
Điều này cũng đúng với sftp - thậm chí các hệ thống con SSH rõ ràng được thực thi từ bên trong một hệ vỏ.
lxgr

Theo kinh nghiệm của tôi, bạn đã đúng, mặc dù trang ssh man nói "Nếu lệnh được chỉ định, nó được thực thi trên máy chủ từ xa thay vì vỏ đăng nhập." Tuy nhiên, người đăng đã có thể giải quyết vấn đề bằng cách sử dụng câu trả lời được đánh giá cao nhất (ssh hostname / bin / sh). Đưa cái gì?
Silvio Levy

@Silvio, câu trả lời của OP là anh ta đã sử dụng một khai thác không liên quan đến SSH.
Tobu

Đúng. Ai đó đã báo cáo thành công với câu trả lời được đánh giá cao nhất và tôi vội vàng cho rằng đó là OP. Tôi ước nó đã làm việc - tôi có một tình huống tương tự, mặc dù nó chỉ gây phiền nhiễu không làm tê liệt. (Xem bình luận của tôi dưới câu trả lời được đánh giá cao nhất ở trên.)
Silvio Levy

6

Không có câu trả lời nào ở trên có thể bỏ qua vỏ đăng nhập của ssh. Bạn có thể truyền một dòng lệnh đầy đủ và do đó, nó chạy shell từ xa để xử lý lệnh và đặt môi trường làm việc cho lệnh. Đó là những gì shell dành cho và đó là cách Unix. Bạn sẽ có tất cả các loại vấn đề tương thích nếu bạn cố chạy một cái gì đó mà không có vỏ. Tương tự như vậy, thử điều khiển C cũng nên thực hiện tương tự như gọi thoát là hành vi bạn đang cố gắng tránh. Nếu bash tiếp tục là một lỗi. Tại sao mọi người cứ nói rằng trang người đàn ông nói điều gì đó khác nhau cần trích dẫn bởi vì nó không nói gì về trang người đàn ông của tôi.

Ngoài ra, trên hầu hết các hệ thống linux, việc chỉ định / bin / sh KHÔNG CÓ vì đây chỉ là một liên kết tượng trưng cho bash!

Muốn thử không? Thêm câu lệnh "echo" cho bạn .bashrc và .profile và xem cái nào đang chạy. Tôi đã làm. Đây là kết quả.

ssh user@hostsẽ thực thi .bash_profile ssh user@host /bin/bashsẽ thực thi .bashrc, nhưng nó nghĩ rằng nó không tương tác (không có dấu nhắc). ssh -t user@host /bin/bashthực thi .bashrc hai lần ... một lần khi đăng nhập, một lần cho lệnh đã qua, vì vậy chỉ định BẤT K shell shell nào sẽ luôn chạy đầu tiên. ssh -T user@hostgiống như không chỉ định -T hoặc -t cả.

Bây giờ, nếu bạn chú ý, hệ thống MY không chạy cả hai tệp, chỉ một hoặc một tệp khác. Nhưng người đăng ban đầu có một dòng trong .bash_profile đang chạy .bashrc, vì vậy .bashrc sẽ luôn được chạy bất kể là gì. Không nên đặt dòng đó ở đó! Nếu dòng đó không tồn tại, bạn sẽ không gặp vấn đề gì.

Bạn sẽ cần tìm một cách khác trong hoặc tìm một quản trị viên. Đây là những gì quản trị viên dành cho.


Một số điểm tốt; không thực thi thông qua như là một lệnh có thể giúp đỡ, như bạn giải thích, nhưng vào một điểm hơi tranh luận: nếu /bin/sh đã được thực hiện đầu tiên, nó sẽ giúp đỡ, vì Bash không tải ~/.bashrckhi gọi như sh. Câu trả lời này là một thay thế cho câu trả lời khác của bạn, vì vậy hãy xóa câu trả lời khác.
mkuity

3

Cái gì đó như:

ssh host "/bin/bash --norc"

có vẻ như hoạt động, nhưng lưu ý rằng PS1 không được đặt để bạn sẽ gõ các lệnh mà không có dấu nhắc.

Điều này có lợi thế là không phá hủy.


1
Điều này không hoạt động, nó đã thử đăng nhập thành công trước, nhưng không thể đăng nhập và do đó không thể chạy bash --norc
Tom Ritter


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

Điều này làm việc cho tôi trong một môi trường rất hạn chế khi không có gì. Tôi đã phải xác định đường dẫn đầy đủ đến .bashrc.
zbeekman

1

Việc trộn ctrl-C hoạt động miễn là bạn có thể nhận được ctrl-C trước khi thoát .bashrc. Thật không may, điều này có thể khó thực hiện nếu exitcó sớm trong .bashrc.

Bạn có thể đặt một ctrl-C càng sớm càng tốt bằng cách chuyển trực tiếp đến ssh:

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

Lưu ý rằng ^Cđược gõ như ctrl-V theo sau là ctrl-C.

Điều này dẫn đến một ctrl-C duy nhất theo sau là đầu vào từ thiết bị đầu cuối điều khiển, trong khi -ttbuộc thiết bị đầu cuối psuedo được phân bổ. Tất cả nói với điều này cung cấp cho bạn một vỏ (hơi dị hình) trên máy từ xa trong khi bỏ qua càng nhiều .bashrc càng tốt.


0

Bạn có thể thử ghi đè lên .bash_profilebằng một tệp trống bằng scplệnh. Từ những gì tôi đã googled, scp sử dụng thông tin đăng nhập không tương tác mà không đọc .bash_profile.


Trừ khi tôi (giả định) nhớ sai cấu trúc thư mục và nó không gây ra lỗi cho tôi, điều này không hoạt động - scp cũng chạy (các) tệp.
Tom Ritter

1
Điều mà mọi người không nhận ra là scp không có gì đặc biệt; nó chỉ là một lệnh khác chạy trên ssh - có nghĩa là tất cả mọi thứ xảy ra cho một phiên bản ssh tương tác với scp, cũng vậy.
larsks

những gì về sftp, afaik nó là một hệ thống con ssh.
allo

0

Bạn cũng có thể xóa tệp bashrc:

ssh <hostname> rm ~/.bashrc

Vấn đề nằm ở tệp .bash_profile, không phải trong bashrc.
Laurent Etiemble

1
Điều này không hoạt động - nó thử vỏ trước và thất bại.
Tom Ritter

0

Nếu hệ thống của bạn được thiết lập bình thường, .bash_profile sẽ không được chạy cho trình bao không tương tác (chẳng hạn như chạy lệnh).

Vì bạn nêu vấn đề nằm trong tệp .bash_profile, hãy thử di chuyển nó ra khỏi đường đi:

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

Tôi không nghĩ cách các tệp được liên kết quan trọng - .bash_profile bao gồm .bashrc = (Tôi đã thêm thông tin.
Tom Ritter

1
Nhưng điều mà Lockie đang đề xuất - được xác nhận bởi trang bash man - là trình bao không tương tác sẽ không chạy .bashrc hoặc .bash_profile. Tuy nhiên, ngay cả khi bạn truyền lệnh trên dòng lệnh ssh (như trong ví dụ này), bash vẫn được bắt đầu dưới dạng shell "tương tác", có nghĩa là nó sẽ đọc tệp .bashrc của bạn. Vì vậy, một ý tưởng tốt, nhưng tiếc là ssh sẽ không hợp tác.
larsks

0

UH = 'người dùng @ máy chủ'; ssh $ UH 'mv ~ / .bashrc ~ / letmein'; ssh $ UH

Vui lòng không cắt và chạy, thay đổi userhostsau đó chỉnh sửa letmeinvà lưu thành.bashrc


0

Kudos cho user60069, nó hoạt động với tôi, nhưng tôi sử dụng tệp khởi động dành riêng cho shell .bashrc, vì vậy đăng nhập bằng / bin / sh làm việc cho tôi.

Tuy nhiên, nếu bạn ở trong tình huống "không may mắn như vậy", tôi cung cấp giải pháp này, dựa trên các giải pháp của user60069 và Dennis W:

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

Dennis W đưa ra tùy chọn --norc, mà ai đó nói không hoạt động với họ.

Chạy "man bash" hoặc "man (shell của bạn)" cho các tùy chọn để vô hiệu hóa các tập tin khởi động. Bạn chỉ cần sử dụng một vỏ abhorrent cho thời gian cần thiết để khắc phục vấn đề.


0

Cách khác để đăng nhập vào máy chủ là không có hồ sơ, vui lòng tìm bên dưới lệnh
ssh -t user@host bash --noprofile

Đối với AWS sử dụng tệp pem và không có người dùng nào khác
ssh -ti "YOUR-PEM-FILE-NAME.pem" ec2-user@YOUR-IP-ADDRESS bash --noprofile

Hi vọng điêu nay co ich!


-1

Từ các đề xuất và phản hồi được đưa ra ở trên, tôi muốn nói rằng đó không phải là các tệp .bashrc hoặc .bash_profile. Ngoài ra ssh manpage nói rằng nếu bạn chỉ định một lệnh sẽ được thực thi thì các tệp hồ sơ của bạn sẽ không được đọc.

Tôi khuyên bạn nên thử thực hiện một vỏ đăng nhập khác (ksh? Csh? Sh?) Từ đường dẫn tuyệt đối; Ngoài ra, hãy cẩn thận rằng đó có thể là một vấn đề hoàn toàn khác (hạn ngạch? thực thi và đọc quyền trên thư mục chính của bạn?), vì vậy cách tiếp cận bên sẽ tốt hơn. Bạn có thể yêu cầu một người dùng khác làm ls -la $YOUR_HOME_DIRvà gửi cho bạn kết quả không?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.