Thủ thuật an toàn dòng lệnh [đóng]


34

Dòng lệnh và kịch bản là nguy hiểm. Tạo một lỗi đánh máy nhỏ với rm -rf và bạn đang ở trong một thế giới bị tổn thương. Nhầm lẫn prod với giai đoạn trong tên của cơ sở dữ liệu trong khi chạy tập lệnh nhập và bạn bị rút gọn (nếu chúng ở trên cùng một máy chủ, điều này không tốt, nhưng xảy ra). Tương tự vì nhận thấy quá muộn rằng tên máy chủ nơi bạn sshed không phải là tên bạn nghĩ sau khi thực hiện một số lệnh. Bạn phải tôn trọng Hole Hawg .

Tôi có một vài nghi thức nhỏ trước khi chạy các lệnh rủi ro - như thực hiện kiểm tra ba lần máy chủ tôi đang truy cập. Đây là một bài viết thú vị về an toàn rm .

Những nghi thức, công cụ và thủ thuật nhỏ nào giúp bạn an toàn trên dòng lệnh? Và ý tôi là những điều khách quan, như "lần đầu tiên chạy ls foo *, hãy nhìn vào đầu ra của nó và sau đó thay thế ls bằng rm -rf để tránh chạy rm -rf foo * hoặc đại loại như thế", chứ không phải "đảm bảo bạn biết những gì lệnh sẽ làm ".


3
+1 để tham khảo "Ban đầu là dòng lệnh" cryptonomicon.com/command.zip
Avery Payne

Đây không phải là một câu hỏi wiki cộng đồng? Sẽ không có một câu trả lời nào có thẩm quyền hay hoàn chỉnh.
Bill Weiss

Câu trả lời:


45

Một hoạt động tốt là sử dụng các màu nền khác nhau trên vỏ của bạn cho các máy chủ prod / staging / test.


6
Có, và cũng sử dụng màu đỏ tươi hoặc màu cam hét bất cứ khi nào bạn có quyền riêng tư gốc.
Adam D'Amico

1
Có cách nào để tự động đặt màu của các thiết bị đầu cuối máy từ xa khác với lúc đăng nhập không? Sử dụng Gnome - Có lẽ đây là một câu hỏi riêng biệt.
Jona

2
Chỉ cần có một câu lệnh chuyển đổi thay đổi biến PS1 của bạn tùy thuộc vào tên máy chủ của máy.
Neil

2
Đối với bất kỳ người dùng Windows nào, có viên ngọc này từ Sysiternals sẽ hiển thị thông tin máy chủ nổi bật trên hình nền. technet.microsoft.com/en-us/sysiternals/ trên
squillman

Có có có - phiên iSeries sản xuất của tôi hiện có màu đỏ để ngăn tôi khỏi: tùy chọn pwrdwnsys (* NGAY LẬP TỨC) khởi động lại (* CÓ)
Peter T. LaComb Jr.

14

Có một kế hoạch rút lui trong tâm trí trước khi bạn bắt đầu.

  • ZIP lên một tập tin / thư mục thay vì xóa nó ngay lập tức
  • đặt bộ định tuyến (cisco) để khởi động lại sau 'x' số phút và không 'viết' ngay lập tức
  • đảm bảo giao diện bạn đang thay đổi không phải là giao diện bạn đã nhập vào hệ thống. Đây có thể là giao diện bộ định tuyến mà bạn telnet'd hoặc cổng ethernet VNC'd đến.
  • không bao giờ đăng nhập với tư cách là 'root'
  • tạo một bản sao lưu. kiểm tra xem nó có tốt không làm một cái khác
  • hỏi ai đó mà bạn tin tưởng 'Tôi sắp làm điều gì đó ngớ ngẩn ở đây?'

3
+1 cisco ios không lưu cho đến khi chắc chắn rằng nó hoạt động. Chết tiệt, tôi nhớ những ngày Amiga khi tất cả các hộp thoại HĐH có "Sử dụng", "Lưu" và "Hủy" - trong đó "Sử dụng" sẽ chỉ áp dụng các cài đặt nhưng không lưu chúng cho lần khởi động lại tiếp theo. Điều đó cực kỳ hữu ích!
Oskar Duveborn

Một giải pháp thậm chí còn tốt hơn hiện nay tôi đoán là có hoàn tác không giới hạn cho tất cả các thay đổi hệ thống - theo cách đó bạn an toàn hơn rất nhiều. Tất nhiên, nếu cài đặt bạn thay đổi làm cho hệ thống hoàn tác tính năng không thể sử dụng được, dù sao bạn cũng sẽ bị hỏng .. hmm ^^
Oskar Duveborn

1
+1 cho "tải lại trong 5". Đã lưu mông của tôi hơn một vài lần khi thay đổi ACL khóa tôi khỏi bộ định tuyến / công tắc từ xa.
Greg làm việc

+1 cho điểm cuối cùng - kiểm tra độ tỉnh táo. Dễ làm, và sau đó ít nhất bạn đã có hai người có quyền lợi để khắc phục mọi sự cố xảy ra;)
Ashley

10

Tôi có một giải pháp công nghệ thấp cho một số trong số này.

Tôi đã phát triển một thói quen bẩm sinh khi làm như sau (khi lập kế hoạch để làm root):

  • Đầu tiên, đăng nhập như một người dùng bình thường, sau đó sử dụng sudo su - rootđể chuyển sang root. Tôi làm điều này như một sự chuẩn bị tinh thần, một lời nhắc nhở với tôi rằng tôi đã đi vào một khu vực rất nguy hiểm và tôi nên cảnh giác và cảnh giác mọi lúc. Nghe có vẻ buồn cười, chỉ riêng nghi lễ nhỏ này đã giúp tôi tiết kiệm rất nhiều đau buồn bằng cách củng cố rằng tôi không thể bất cẩn .
  • Mỗi lệnh được gõ nhưng phím [Trả về] không bao giờ được nhấn. Không bao giờ .
  • Không có lệnh nào được thực hiện mà không hiểu chính xác những gì nó làm. Nếu bạn đang làm điều này mà không biết nó làm gì, bạn đang chơi roulette Nga với hệ thống của bạn.
  • Trước khi nhấn phím [Trả về], lệnh được bật ra trên CLI được kiểm tra cẩn thận bằng mắt. Nếu có bất kỳ do dự, bất kỳ gợi ý về vấn đề tiềm năng, nó sẽ được kiểm tra lại một lần nữa. Nếu sự do dự đó vẫn còn, lệnh sẽ bị bỏ lại trên dòng và tôi chuyển sang bảng điều khiển khác để tham khảo các trang hướng dẫn, v.v. Nếu trong một phiên đồ họa, tôi khởi chạy trình duyệt và thực hiện một số tìm kiếm.
  • Không có người dùng thông thường nào được trao sudocho các hệ thống của tôi, không phảitôi là BOFH , mà bởi vì không có sự chuẩn bị và huấn luyện, điều này giống như đưa một khẩu súng nạp cho một con khỉ. Lúc đầu thật vui và thú vị, cho đến khi con khỉ nhìn xuống cái thùng và siết chặt ...

Khi sử dụng rm, tôi luôn cdvào thư mục trước, sau đó sử dụng tiền tố của ./để đảm bảo rằng thư mục đúng, nghĩa là

cd /usr/some/directory ; rm ./targetfile

hoặc tôi chỉ định toàn bộ đường dẫn của tệp

rm /usr/some/directory/targetfile

đó là Pita nhưng ... an toàn tốt hơn xin lỗi.


1
Tôi chỉ đưa ra sudo cho một danh sách các lệnh được chọn trước, như tải lại apache2. Nếu không, người dùng phải thông qua tôi. Đó là một nỗi đau ở mông nhưng đó là cách phòng thủ tốt nhất để chạy devbox cho 15 người.
Artem Russakovskii

2
Trích dẫn: "nhưng vì không có sự chuẩn bị và huấn luyện, điều này giống như đưa một khẩu súng nạp cho một con khỉ. Lúc đầu, nó thật thú vị và vui vẻ, cho đến khi con khỉ nhìn xuống nòng súng và bóp ..." Thật ra, sau đó vẫn còn buồn cười. .. chỉ khá lộn xộn
Mikeage

Bạn nên sử dụng sudo -i thay vì sudo su và nói chung sử dụng sudo để chạy các lệnh cụ thể sẽ an toàn hơn một chút.
LapTop006

Làm thế nào để bạn thực hiện lệnh nếu bạn KHÔNG BAO GIỜ nhấn phím quay lại?
g.

1
&& là bạn của bạn! Thay vì làm thư mục cd / usr / some /; rm ./targetfile bạn nên cd / usr / some / thư mục && rm ./targetfile Bằng cách đó, bạn sẽ không bao giờ kết thúc rm'ing targetfile trong thư mục gốc của mình nếu cd thất bại. Làm đầy đủ đường dẫn rm là tốt hơn, mặc dù.
Mike G.

10

Cái này là dành riêng cho Windows Powershell.

Là một chính sách, chúng tôi thêm vào sau hồ sơ máy.ps1 trên mỗi máy chủ. Điều này đảm bảo rằng những điều sau là đúng:

  1. Cửa sổ bảng điều khiển powershell có màu nền đỏ sẫm
  2. Quản trị viên được thêm vào tiêu đề
  3. Thông báo "Cảnh báo: Powershell đang chạy với tư cách Quản trị viên." được viết khi khởi động
  4. Thanh tiêu đề có tiền tố là "Quản trị viên:"
  5. Các tiện ích tiêu chuẩn (như tập lệnh shell của công ty, vim và thông tin) nằm trong đường dẫn.
$ currentPrincipal = New-Object Security.Principal.WindowsPrincipal ([Security.Principal.WindowsIdentity] :: GetCản ())
& {
    if ($ currentPrincipal.IsInRole ([Security.Principal.WindowsBuiltInRole] :: Administrator))
    {
        (nhận máy chủ) .UI.RawUI.Backgroundcolor = "DarkRed"
        chủ nhà rõ ràng
        máy chủ ghi "Cảnh báo: PowerShell đang chạy với tư cách Quản trị viên. '
    }

    $ tiện ích = $ null
    if ([IntPtr] :: size * 8 -eq 64)
    {
        $ host.UI.RawUI.WindowTitle = "Windows PowerShell (x64)" 
        $ ích = "$ {env: chương trình (x86)} \ Tiện ích"
    }
    khác
    {
        $ host.UI.RawUI.WindowTitle = "Windows PowerShell (x86)"
        $ ích = "$ {env: chương trình} \ Tiện ích"
    }
    if ((Đường dẫn thử nghiệm $ tiện ích) -và! ($ env: đường dẫn -match $ tiện ích.Replace ("\", "\\")))
    {
        $ env: path = "$ tiện ích; $ {env: path}"
    }
}

chức năng Nhắc
{
    if ($ currentPrincipal.IsInRole ([Security.Principal.WindowsBuiltInRole] :: Administrator))
    {
        if (! $ host.UI.RawUI.WindowTitle.StartsWith ("Quản trị viên:"))
        {$ Host.UI.RawUI.WindowTitle = "Quản trị viên:" + $ host.UI.RawUI.WindowTitle}
    }
    'PS' + $ (if ($ Nestedprompussyvel -ge 1) {'>>'}) + '>'
}

Điều đó thật tuyệt - Tôi ước bạn có thể dễ dàng làm một cái gì đó như thế trong linux trên tất cả các máy chủ của bạn.
Jason Tan

1
Trong powershell, điều này được thực hiện bằng cách chỉnh sửa $ pshome / profile.ps1 (hồ sơ máy). Tại sao bạn không thể làm một cái gì đó tương đương trên Linux trong /etc/.bash_profile?
Brian Reiter

2
Cũng hữu ích để thay đổi $ ConfirmPreference thành "trung bình" (mặc định là cao) và nhiều thứ sẽ nhắc xác nhận.
Richard

6

Tôi có thể đồng ý với tất cả các câu trả lời trên nhưng tôi phải nhấn mạnh mẹo rất, rất quan trọng này:

Biết khi nào nên tránh đa nhiệm.


5

Tôi chắc chắn rằng tên máy chủ của hệ thống tôi đang ở trong dấu nhắc bash (hoặc shell khác). Nếu tôi bị chê, tôi chắc chắn rằng nó cũng sẽ ở đó.

Tôi đã từng cài đặt một hệ thống Gentoo từ một bản phân phối Linux trực tiếp khác và vô tình chạy một lệnh khá phá hoại (không thể nhớ đó là ATM - một số biến thể của rm) trong vỏ sai, gây ra một loạt các thứ trên hệ thống trực tiếp đã xóa, thay vì những thứ từ bên trong chroot. Từ đó trở đi, tôi luôn làm

export PS1="(chroot) $PS1"

Bất cứ khi nào tôi đang làm việc trong một chroot.


1
+1 - đồng thời, tôi thấy thật hữu ích khi có thư mục làm việc hiện tại (hoặc n lớp cuối cùng của nó, nếu bạn đang làm việc trong các hệ thống tệp được lồng sâu) trong lời nhắc.
Murali Suriar

Cẩm nang Gentoo chính thức gợi ý chính xác điều đó, khi chuyển từ đĩa CD trực tiếp sang Gentoo mới được tạo!
cd1

CD1: có, nhưng hướng dẫn cài đặt nhanh x86 ( gentoo.org/doc/en/gentoo-x86-quickinstall.xml ) thì không, và đó là những gì tôi đang sử dụng vào thời điểm đó. Nhưng bây giờ tôi làm theo phản xạ :)
Tim

5

Có một vài điều quan trọng cần lưu ý trước khi thay đổi máy chủ:

  • Hãy chắc chắn rằng tôi đang ở đúng máy chủ

  • Hãy nhận biết ** có bao nhiêu người sẽ bị ảnh hưởng bởi hành động này * (nếu bạn có nhầm lẫn hay không)

  • Trước khi nhập phím 'enter', hãy lưu ý khả năng hoàn tác

  • Hãy tự hỏi liệu lệnh này có khả năng ngắt kết nối phiên của bạn không (quy tắc fw, tắt máy, v.v ...). Hãy chắc chắn rằng bạn có một chuyển đổi dự phòng để quay lại (đặc biệt nếu bạn ở ngoài)


4

Nếu bạn chưa làm thì nó đã bí danh rm-rm -i


7
Không, không, không, không. Đây là một trong những điều tồi tệ nhất bạn có thể làm. Một ngày nào đó bạn sẽ thấy mình trên một cái hộp không có bí danh hoặc bằng cách nào đó bạn đã bỏ rác env của chúng tôi. Học cách sử dụng rm -i thay thế.
olle

Không, không, không, không. Làm điều này Một ngày nào đó bạn sẽ vô tình làm điều sai trái và tự cứu mình. Thường xuyên hơn bạn sẽ quên đặt -i trên dòng và vặn và xóa điều sai.
Jerub

Tôi sẽ không làm điều đó nếu tôi từng làm việc trên nhiều máy ... Làm việc với máy mới cho đến khi thiết lập được là một thách thức lớn.
slovon

Điều khủng khiếp là cả @olle và @Jerub đều đúng. Có lẽ sẽ rất thông minh khi đặt một số cờ, có thể có màu, trong PS1 cho biết 'an toàn tắt' / 'an toàn trên' ...
ikso

4

Quy tắc 1 - tạo bản sao lưu

Quy tắc 2 - KHÔNG BAO GIỜ thêm trình bao bọc "molly Guard" vào các lệnh tiêu chuẩn, tạo phiên bản của riêng bạn, nhưng đừng chiếm lấy tên, nó sẽ chỉ cắn bạn khi bạn sử dụng hệ thống mà bạn chưa thiết lập.

Các thủ thuật nhắc nhở như màu khác nhau cho thư mục gốc và (một phần) là những trợ giúp tuyệt vời, nhưng một lần nữa, đảm bảo bạn có thể làm việc mà không cần chúng.


"Người bảo vệ molly" tôi chưa bao giờ nghe thuật ngữ đó trước đây là gì?
Jason Tan


4

Điều này có vẻ phản trực giác và ít 'ardkore, nhưng mẹo an toàn dòng lệnh tốt nhất tôi có là: Nếu một phương thức thay thế chế độ GUI có sẵn và thực tế, thì hãy SỬ DỤNG CNTT .

Tại sao? Kha đơn gảin. Chế độ GUI thường có mạng lưới an toàn tích hợp, dưới dạng "cảnh báo - bạn sắp sửa gầm gừ freeblefrop, bạn có chắc chắn muốn làm điều này?" Thậm chí nếu không, nó làm bạn chậm lại, tạo thêm không gian cho thời gian suy nghĩ. Nó cho phép bạn kiểm tra các tùy chọn dễ dàng hơn trước khi cam kết với chúng, bạn có thể chụp màn hình trước và sau các trạng thái, nó bảo vệ bạn khỏi lỗi chính tả; tất cả các công cụ tốt, hữu ích và hữu ích.

Trong trường hợp kinh điển của "rm -rf" đáng sợ, bạn có nghĩ rằng việc vô tình phát hành nó từ GUI hoặc CLI không dễ dàng hơn?

Cuối cùng, không có gì xấu hổ khi dùng đến GUI. Nó sẽ không ngăn chặn được những thảm họa lớn; thật dễ dàng để có thể kích hoạt hạnh phúc trong GUI như trong CLI; nhưng nếu nó cứu bạn một khi nó đã chứng tỏ mình xứng đáng.


3

Sử dụng thông thường và không chạy các lệnh bạn không hiểu. Đó là tất cả những lời khuyên tốt. Nếu bạn cảm thấy đau đớn khi viết ra con đường tuyệt đối của tất cả mọi thứ bạn chuyển đến rm, hoặc chạy bất cứ thứ gì qua sudo, hãy thoải mái. Tôi thích su -c hơn. Ít nhất là nó không lưu trữ mật khẩu. Tôi sẽ không cảm thấy thoải mái với bất kỳ người dùng thông thường nào được phép chạy mọi thứ với quyền root mà không cần xác minh mật khẩu.

Có một vài điều bạn có thể đặt vào ~ / .bashrc để làm cho mọi thứ an toàn hơn một chút, chẳng hạn như:

alias srm='rm -i'

Cho phép bạn có một sự thay thế an toàn của rm, ...

Nhưng cuối cùng, bạn có thể và sẽ luôn làm hỏng việc. Hôm trước tôi có một tập lệnh cấu hình không còn tồn tại trong toàn bộ thư mục / usr / bin, phá vỡ một số thứ. Có, một 'cài đặt' đơn giản của bất kỳ loại phần mềm nào có lỗi trong đó, có thể phá vỡ hệ thống của bạn. Bạn KHÔNG BAO GIỜ an toàn, bất cứ điều gì bạn làm. Những gì tôi đang nhận được là, điều quan trọng nhất:

Giữ bản sao lưu thường xuyên.


2
Một lần nữa- ĐỪNG BAO GIỜ C ALNG "rm". Cuối cùng, bạn sẽ bị làm phiền bởi nó, khi bạn làm việc trên một hệ thống không có bí danh.
Im lặng

Một ý tưởng rất tồi. Nếu bạn đã bao giờ thấy mình trên Mac OS X (có thể các nền tảng khác?) srman toàn loại bỏ !
Nhà xác

3

Thay vì đặt bí danh rm thành rm -i, sẽ tốt hơn nếu nói bí danh là xóa hoặc an toàn hơn (và sử dụng chúng làm công cụ xóa ưa thích của bạn). Sau đó, khi bạn sử dụng một hộp chưa được thiết lập này, không có thiệt hại nào được thực hiện.


2

Hãy chắc chắn rằng bạn không bao giờ chạy lệnh bạn tìm thấy trực tuyến trừ khi bạn hoàn toàn hiểu những gì họ đang làm.

Hệ thống của bạn có thể khác với người gửi và điều đó có thể gây ra một thế giới bị tổn thương.


2

Một điều hiển nhiên cho sự an toàn của dòng lệnh theo quan điểm Unix / Linux là việc sử dụng đúng tài khoản root.
Một rm -rf là ​​root thường nguy hiểm hơn so với người dùng và sử dụng những thứ có sẵn như sudo thay vì đăng nhập như root là rất quan trọng. Một whoami đơn giản tốt đẹp thường sẽ giúp cho tâm thần phân liệt hoặc nhiều tính cách.

Điều đó và chuẩn bị tiếng vang cho bất kỳ lệnh filechanging nào, đặc biệt là nếu bạn muốn đảm bảo rằng bạn có một trận đấu toàn cầu hoặc regex đúng.


2

Có một kết nối phụ vào máy bạn đang làm việc có thể hữu ích trong trường hợp bạn giết phiên chính của mình hoặc làm điều gì đó ngớ ngẩn để khóa nó ... xử lý nặng, v.v.

Bằng cách đó, bạn vẫn có quyền truy cập vào máy và có thể giết phiên chính của mình.

Hầu hết các ý kiến ​​trên đều đề cập đến rm, nhưng tôi cũng đã làm một số điều ngu ngốc với các lệnh khác ...

ifconfig để gỡ xuống mạng - ouch, đòi hỏi phải có sự hiện diện vật lý để sửa chữa.

Đối với kịch bản, tôi thường làm việc trong hai cửa sổ. Cái đầu tiên tôi sử dụng để viết kịch bản, cái thứ hai để kiểm tra từng dòng khi tôi viết nó. Đi chậm và cẩn thận tôi có thể đảm bảo rằng mọi dòng hoạt động như tôi mong đợi khi tôi viết mã, chú ý duy trì các biến giống nhau, v.v.

Cá nhân, tôi không tìm thấy lời nhắc thêm cho những thứ như rm-tôi thực sự giúp đỡ. Tôi mắc hầu hết các lỗi của mình khi v. Mệt mỏi, căng thẳng, v.v., đó là những lúc tôi sẽ đập ra và bỏ qua lời nhắc. Thực hành xấu có lẽ.


2

Nếu bạn sử dụng bash, hãy thử điều này:

TMOUT=600

trong /root/.bashrchoặc tương tự của bạn . Nó tự động đăng xuất bạn sau 10 phút, giảm khả năng bạn sẽ chuyển sang thiết bị đầu cuối gốc mà bạn vô tình bỏ ngỏ và gõ một cái gì đó ngu ngốc.

Vâng, tôi biết bạn nên sử dụng sudo để thực thi các lệnh gốc - đây chỉ là một mạng lưới an toàn bổ sung trong trường hợp bạn quyết định chơi nó một ngày đầy rủi ro.


2
# Allow only UPDATE and DELETE statements that specify key values
alias mysql="mysql --safe-updates"`

Một bí danh rất được khuyến khích để có xung quanh nếu bạn từng sử dụng mysql CLI.


1

Thay vì ls tôi sử dụng echo để tôi có thể thấy lệnh đầy đủ sau khi shell đã mở rộng mọi thứ. Ngoài ra, luôn luôn nhân đôi các biến đại diện cho các tệp để công cụ của bạn hoạt động với các tên tệp có thể có các tab hoặc dấu cách.


1

Tôi tránh toàn *cầu như là lý lẽ của riêng mình bất cứ khi nào có thể. Ngay cả khi tôi thực sự có nghĩa là "loại bỏ mọi thứ trong thư mục này", tôi cố gắng cụ thể hơn, tức là. rm *.php. Đó là kiểm soát thiệt hại phòng ngừa trong trường hợp tôi vô tình chạy cùng một lệnh ra khỏi lịch sử trong một thư mục khác.


Tôi đã học cách không bao giờ "cd dir; rm -rf *", mà thay vào đó luôn luôn là "rm -rf dir", càng cụ thể càng tốt.
slovon

1

Một cách tuyệt vời để khiến bạn suy nghĩ về những gì bạn đang làm là thêm một cái gì đó như thế này vào root bashrc (cshrc, sao cũng được):

unset PATH

Bằng cách đó, bạn phải làm / bin / rm thay vì chỉ "rm". Những nhân vật phụ có thể khiến bạn phải suy nghĩ.


OK, lệnh này tôi muốn chạy ở đâu? which $COMMANDcông việc ngắn hạn.
Kevin M

/ usr / bin / định vị $ THÔNG TIN?
Bill Weiss

Thậm chí tốt hơn, / usr / bin / xác định vị trí -r / $ LỆNH $
Bill Weiss

1

Đối với regex phức tạp, đặc biệt là các lệnh 'find' đặt echo ở phía trước và bắt chúng vào một tệp. Sau đó, bạn có thể kiểm tra xem bạn có thực sự xóa / di chuyển / vv chính xác những gì bạn nghĩ bạn đang có trước khi thực hiện tệp với 'nguồn'.

Nó cũng thuận tiện để thêm thủ công các trường hợp cạnh mà regex không nhận.


1

Một chút meta cho một số bài đăng khác: Tôi sử dụng các bước echo / ls thông thường được đề xuất trước tiên, để đảm bảo rằng lệnh đang chọn tập hợp các tệp tôi muốn hoặc được trình bày bởi shell như dự định.

Nhưng sau đó tôi sử dụng các tính năng chỉnh sửa lịch sử lệnh của shell để lấy lệnh trước đó và chỉ sửa đổi các phần cần thay đổi.

Hoàn toàn không giúp gõ từng lệnh này một cách độc lập ...

$ ls *.bak
$ echo rm *.bak
$ rm * .bak

... bởi vì tôi đã vô tình gõ một khoảng trắng ở dòng cuối cùng và xóa tất cả các tệp. Tôi sẽ luôn lấy lại dòng trước đó và chỉ cần loại bỏ 'echo'.


1

người dùng root:
Không được root trừ khi bạn phải.
Nếu nhà cung cấp nói rằng nó cần chạy dưới quyền root, hãy nói với họ rằng bạn là khách hàng và bạn muốn chạy nó dưới dạng root.
Có bao nhiêu gói phần mềm ngoài giá muốn root 'chỉ vì nó dễ dàng hơn'?

thói quen:
không bao giờ sử dụng '*' với loại bỏ mà không nhìn vào nó ba lần Tốt nhất là xây dựng thói quen sử dụng ls -l TargetPotype , sau đó sử dụng 'rm! $'. Mối đe dọa lớn nhất không phải là nơi bạn nghĩ rằng bạn đang có. Tôi gần như gõ 'tên máy chủ' thường xuyên như 'ls'!

nạng:
một dấu nhắc tiêu chuẩn giúp rất nhiều, cũng như các bí danh như "alias rm = 'rm -i'", nhưng tôi thường không có toàn quyền kiểm soát các máy tôi đang sử dụng vì vậy tôi chỉ sử dụng tập lệnh bao bọc dự kiến để đặt đường dẫn của bạn , dấu nhắc và bí danh với '-i'

tìm kiếm sự cố:
sử dụng đường dẫn đầy đủ giúp ích, nhưng trong trường hợp không thể, hãy cd vào một vị trí an toàn hơn và CSONG sử dụng '&&' để đảm bảo rằng 'cd' thành công trước khi bạn tìm, xóa, xóa, gỡ bỏ, v.v .:
ví dụ: cd /filesystema && tar cf - | ( cd /filesystemb && tar vxf -)
việc sử dụng '&&' có thể ngăn chặn tệp tar được trích xuất trên đầu trang trong trường hợp này (mặc dù trong trường hợp này 'rsync' sẽ tốt hơn)

xóa:
không bao giờ xóa đệ quy nếu bạn có thể giúp nó, đặc biệt là trong một tập lệnh. tìm và xóa bằng -type f và -name 'mẫu' Tôi vẫn sống trong nỗi sợ phải cho ăn 'không có gì' để xargs ... tar và gỡ bỏ để di chuyển mọi thứ xung quanh (thay vào đó sử dụng rsync)


1

Nếu bạn sử dụng nhiều biến thể của một hệ điều hành, được rất nhận thức được sự khác biệt về cú pháp; những gì hợp lý an toàn trên một biến thể unix là cực kỳ nguy hiểm ở một biến thể khác.

Ví dụ: killall

Linux / FreeBSD / OSX - giết tất cả các quy trình khớp với tham số được truyền. ví dụ: "killall apache" giết chết tất cả các apaches, để lại tất cả các quá trình khác.

Solaris - giết chết tất cả các quy trình. Không, thực sự. Từ trang man : killall được sử dụng bằng cách tắt máy (1M) để giết tất cả các quy trình hoạt động không liên quan trực tiếp đến quy trình tắt máy.


Tôi đã học được một cái trên máy chủ dự phòng của chủ nhân trước đó. Trong khi nó đang chạy băng đêm. Ow.
Bill Weiss

1
Bạn có thể sử dụng pkill thay vì hoạt động trên solaris và linux.
Jason Tan

0

Thay vì

rm foo*

sử dụng

rm -i foo*

Điều này là thực tế với một số ít các tập tin, nhưng không phải với toàn bộ tarball. Đó là lý do tại sao răng cưa rmsẽ cản trở bạn.


đó là những gì công tắc -f dành cho: ghi đè mọi công tắc -i trước đó. Nếu bạn đặt nó vào .bash_profile hoặc tập lệnh khởi tạo shell tương tự, bạn sẽ không phải lo lắng về nó. Chỉ cần chắc chắn rằng bạn muốn làm điều đó, nhưng nó đã được nói trước đó, và hùng hồn hơn.
Kevin M

0

Chạy lệnh với echo trước là một ý tưởng tốt, nhưng nó vẫn dễ bị lỗi chính tả.

Hãy thử sử dụng nó với một bản mở rộng như! $.

echo foo*
rm -rf !$

! $ Mở rộng đến từ cuối cùng của lệnh cuối cùng, vì vậy nó tương đương với

echo foo*
rm -rf foo*

Ngoài ra còn có! *, Mở rộng cho tất cả các đối số cho lệnh cuối cùng.

Thật vậy, bạn có thể làm theo cách này nếu bạn thích

echo rm -rf foo*
!*

(Nếu bạn đang sử dụng ksh, không phải bash, bạn có thể nhập khoảng thời gian Esc + để chèn từ cuối cùng.)


Esc +. làm việc trong bash quá.
olle

0

Trong trường hợp của một cái gì đó như:

ls * .php
tiếng vang rm * .php
rm * .php

Bạn có thể sử dụng toán tử thay thế, như thế này:
$ ls * .php
<danh sách dir>

$ ^ ls ^ echo rm (điều này thay thế ls trong lệnh trước bằng echo rm, giữ phần còn lại của dòng lệnh như cũ)

$ ^ echo rm ^ rm (thay thế echo rm chỉ bằng rm, do đó bạn không phải gõ lại * .php và ném vào chỗ trống không đúng lúc)

^ = shift-6, cho những người không quen thuộc với nó.


Ick. Tôi thà sử dụng các phím mũi tên của mình và chỉnh sửa dòng trước đó. Bằng cách đó tôi có thể thấy lệnh nào sắp chạy khi tôi nhấn Enter, thay vì tin tưởng một cách mù quáng để có được mô hình thay thế đúng.
Marius Gedminas

Ví dụ: sau "echo rm * .php", bạn thực hiện <Up> <Home> <Alt-D> và sau đó <Enter>.
Marius Gedminas

0

Sử dụng bash và đặt PS1 = '\ u @ \ h: \ w>'. Điều này mở rộng thành tên người dùng @ hostname: / full / work / thư mục / path> Như đã đề cập trong các câu trả lời khác, bạn có thể sử dụng mong đợi để thiết lập môi trường bất cứ khi nào bạn đăng nhập nếu bạn không thể cập nhật các tệp .profile hoặc .bash_profile. Thay đổi màu nền dễ dàng là câu trả lời tốt nhất mặc dù :-)


-1

À đúng rồi. Thủ thuật cũ đó là gửi cho ai đó một tập tin thông qua IRC có tên "-rf" để nó kết thúc trong thư mục ~ của họ. Một chút "rm -rf" sau (thay vì "rm - -rf") và nhiều tiếng cười xảy ra khi họ học được một bài học khắc nghiệt về việc không chạy IRC làm root.


+1 cho yếu tố rofl
David Z

Vì vậy, "rm -rf" được cho là gây hại cho bạn như thế nào?
kubanchot

Có lẽ tập tin thực sự được đặt tên là "-rf *"?
Marius Gedminas

-1

Thay vì sử dụng rm -rf <dir>đặt -rfở cuối như vậy : rm <dir> -rf. Hãy nghĩ về nó như loại bỏ sự an toàn sau khi bạn đã nhắm và trước khi bạn bắn. Bằng cách đó, bạn được bảo vệ nếu bạn có một phím nhập trong khi nhập tên thư mục (hoặc sử dụng hoàn thành tab) và có các thư mục được đặt tên tương tự.

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.