2012-01-24 45 views
34

Tôi đã tìm kiếm câu trả lời cho câu trả lời này nhưng không thể tìm thấy câu trả lời.tự xóa tập lệnh shell

Tôi đã viết một kịch bản đơn giản thực hiện cài đặt máy chủ ban đầu và tôi muốn nó tự xóa/hủy liên kết khỏi thư mục gốc khi hoàn thành. Tôi đã thử một số giải pháp tôi googled (ví dụ/bin/rm $ test.sh) nhưng kịch bản luôn luôn có vẻ vẫn còn tại chỗ. Điều này có thể không? Dưới đây là kịch bản của tôi cho đến nay.

#! /bin/bash 
cd /root/ 
wget -r -nH -np --cut-dirs=1 http://myhost.com/install/scripts/ 
rm -f index.html* *.gif */index.html* */*.gif robots.txt 
ls -al /root/ 

if [ -d /usr/local/psa ] 
    then 
     echo plesk > /root/bin/INST_SERVER_TYPE.txt 
    chmod 775 /root/bin/* 
    /root/bin/setting_server_ve.sh 
    rm -rf /root/etc | rm -rf /root/bin | rm -rf /root/log | rm -rf /root/old 
    sed -i "75s/false/true/" /etc/permissions/jail.conf 
     exit 1; 
elif [ -d /var/webmin ] 
    then 
    echo webmin > /root/bin/INST_SERVER_TYPE.txt 
    chmod 775 /root/bin/* 
    /root/bin/setting_server_ve.sh 
    rm -rf /root/etc | rm -rf /root/bin | rm -rf /root/log | rm -rf /root/old 
    sed -i "67s/false/true/" /etc/permissions/jail.conf 
     break 
    exit 1; 
else 
    echo no-gui > /root/bin/INST_SERVER_TYPE.txt 
    chmod 775 /root/bin/* 
    /root/bin/setting_server_ve.sh 
    rm -rf /root/etc | rm -rf /root/bin | rm -rf /root/log | rm -rf /root/old 
    sed -i "67s/false/true/" /etc/permissions/jail.conf 
     break 
    exit 1; 
fi 
+2

Nếu bạn định chơi kịch bản tự xóa, bạn phải đảm bảo bạn có bản sao lưu ở đâu đó mỗi lần trước khi thử nghiệm. Hoặc bạn có thể thay thế 'rm' bằng' $ {RM: -/bin/rm} 'để thử nghiệm. Mã của bạn đường dẫn 'rm' kết quả đầu ra vào lệnh' rm' tiếp theo là khá lạ; 'rm' không đọc từ đầu vào tiêu chuẩn trừ khi nó tương tác (nó sẽ không có' -rf'), cũng không ghi vào đầu ra tiêu chuẩn. Sự lặp lại là xấu. Và không có cách nào tôi muốn bạn loại bỏ các công cụ từ '/ root' trên máy của tôi. Ngoài ra, hãy kiểm tra xem các tác phẩm 'cd/root /'; 'cd/root/|| thoát 1'. –

+1

Xin chào Jonathan. Cảm ơn rất nhiều phản hồi của bạn. Như bạn có thể nói, tôi khá mới mẻ với tất cả điều này. Tôi đã thực hiện một sai lầm thực sự cơ bản với vị trí của phần testmsh rm nhưng nó hoạt động tốt ngay bây giờ. Cũng sửa chữa lệnh rm. Cảm ơn một lần nữa! – RFH

+2

Tại sao bạn cần xóa tập lệnh này? Ví dụ, nếu đó là một lần bạn chạy trên máy chủ từ xa, bạn có thể chạy 'ssh host l0b0

Trả lời

53
rm -- "$0" 

Cần làm điều này. $ 0 là một biến ảo cho đường dẫn đầy đủ của tập lệnh được thực thi.

+2

Dưới 'bash', có vẻ như là trường hợp (' $ 0' là đường dẫn đến tập lệnh); 'không phải lúc nào cũng như vậy (vỏ khác, hệ điều hành khác), và có lẽ không phải như vậy trên tất cả các hệ thống ngay cả bây giờ. –

+0

Tôi đã được ấn tượng rằng nó đã được xác định bởi posix, trong nói rằng tôi không có chuyên gia. Tôi (ab) sử dụng kludges như 'cd $ (dirname $ 0)' khá ngớ ngẩn trong các tập lệnh sử dụng '#!/Bin/sh' làm thông dịch viên trên hầu hết các dòng BSD, linux, osx và solaris và loại bỏ nhưng tôi không thể hứa hẹn về mọi thứ. – richo

+0

cảm ơn. điều này cũng làm việc :) – RFH

15

này làm việc cho tôi:

#!/bin/sh 

rm test.sh 

Có lẽ bạn đã không thực sự có nghĩa là để có '$' trong '$ test.sh'?

+0

nó đã hoạt động! cảm ơn rất nhiều. – RFH

+6

wow, bạn thực sự chưa thử điều này? haha – justhalf

-2

Tại sao xóa tập lệnh? Như người khác đã đề cập nó có nghĩa là bạn phải giữ một bản sao ở nơi khác.

Đề xuất là sử dụng phương pháp tiếp cận "firstboot". Chỉ cần tạo một tệp trống trong ví dụ:/etc/sysconfig kích hoạt việc thực thi tập lệnh này nếu nó có mặt. Sau đó, xóa tệp đó ở cuối tập lệnh.

Sửa đổi tập lệnh sao cho tập lệnh có tiêu đề chkconfig cần thiết và đặt nó vào /etc/init.d/ để nó chạy ở mọi lần khởi động.

Bằng cách đó bạn có thể chạy lại tập lệnh sau này bằng cách tạo lại tập lệnh kích hoạt.

Hy vọng điều này sẽ hữu ích.

+17

Tôi thường không chỉ trích xuống nhưng khi tôi làm, tôi để lại nhận xét. Vì vậy, ở đây nó là: Bạn "trả lời" không phải là một giải pháp cho những gì được hỏi. Và nói chung không phải việc của bạn là lý do tại sao người hỏi muốn làm điều gì đó. Đặt câu hỏi về động cơ của người hỏi là dư thừa, khó chịu và không có chủ đề. Như trong trường hợp cụ thể này: hiếm khi nhưng đôi khi rất quan trọng đối với một tệp để xóa chính nó, ví dụ: khi bạn muốn chạy tập lệnh gỡ cài đặt. Câu trả lời của ziesemer là một giải pháp hoàn hảo trong trường hợp này. –

+1

@TranSonHai: Xin lỗi nếu bạn bị kích thích bởi câu trả lời. Nhưng tôi thành thật tin rằng trong nhiều trường hợp, cách tiếp cận này rất hữu ích cho người dùng đối mặt với một vấn đề tương tự. – Bram

+4

Tôi không biết bất kỳ trường hợp nào mà cách tiếp cận của bạn có thể mang lại lợi ích. Sự hiểu biết của tôi là khi bạn muốn, nói rằng có một cái gì đó gỡ bỏ cài đặt chính nó, bạn muốn để lại không có dấu vết sau đó. Tạo ra một kịch bản bên ngoài để xóa những thứ cuối cùng dẫn đến một tình huống nghịch lý, nơi bạn cần tạo một kịch bản bên ngoài khác để xóa tập lệnh bên ngoài đó, v.v. Vậy tại sao không chấp nhận câu trả lời đơn giản, thanh lịch mà những người ở trên đã cung cấp và bỏ những thứ phức tạp một cách không cần thiết? –

3

Tập lệnh có thể tự xóa thông qua shred command (dưới dạng xóa an toàn) khi nó thoát.

#!/bin/bash 

currentscript="$0" 

# Function that is called when the script exits: 
function finish { 
    echo "Securely shredding ${currentscript}"; shred -u ${currentscript}; 
} 

# Do your bashing here... 

# When your script is finished, exit with a call to the function, "finish": 
trap finish EXIT 
Các vấn đề liên quan