इसे इतिहास में रखे बिना निष्पादित कमांड [बंद]


203

मैं कुछ कमांड निष्पादित करना चाहता हूं लेकिन उन्हें कमांड इतिहास में स्टोर नहीं करना चाहता। ताकि कोई भी इसे .bash_historyफाइल में सर्च नहीं कर सकेगा ।

क्या कोई तरीका है कि कैसे इस तरह से bash कमांड निष्पादित करें?


13
इस प्रश्न को संभवतः ServerFault में ले जाना चाहिए क्योंकि यह "प्रोग्रामिंग" नहीं है जितना कि यह "सर्वर व्यवस्थापक" है - लेकिन प्रश्न / उत्तर के लिए धन्यवाद, वास्तव में मुझे क्या चाहिए!
एंड्रयू थेकेन

जवाबों:


294

एक स्थान के साथ अपनी कमान शुरू करें और इसे इतिहास में शामिल नहीं किया जाएगा।

ज्ञात हो कि इसके लिए पर्यावरण चर $HISTCONTROLको सेट करने की आवश्यकता होती है ।

  • जाँच करें कि निम्न आदेश देता है ignorespaceया ignoreboth

    #> echo $HISTCONTROL
  • लापता होने पर पर्यावरण चर जोड़ने के लिए, निम्नलिखित लाइन को बैश प्रोफाइल में जोड़ा जा सकता है। उदाहरण के लिए%HOME/.bashrc

    export HISTCONTROL=ignorespace

प्रोफ़ाइल सोर्स करने के बाद फिर से पूर्वनिर्धारित कमांड को नहीं लिखा जाएगा $HISTFILE


20
यह तब तक काम नहीं करता जब तक कि इग्नोरस्पेस $ HISTCONTROL में शामिल न हो जाए - हालांकि यह संभवतः अधिकांश प्रणालियों पर डिफ़ॉल्ट है।
१०

2
सही बात। अधिक जानकारी के लिए ओपी को बैस्ट मैन पेज में HISTCONTROL और HISTIGNORE पर एक नजर होनी चाहिए।
u-punkt

2
Thegeekstuff.com/2008/08/… - इतिहास से आदेशों को छिपाने की इस विधि सहित अधिक बैश इतिहास युक्तियां यहां उपलब्ध हैं
user379997

52

किसी भी बैश सत्र में, टाइप करके इतिहास फ़ाइल को / dev / null पर सेट करें:

export HISTFILE=/dev/null

ध्यान दें, जैसा कि टिप्पणियों में बताया गया है, यह इतिहास में उस सत्र में कोई आदेश नहीं लिखेगा!

बस अपने सिस्टम प्रशासक की कड़ी मेहनत के साथ गड़बड़ न करें, कृपया;)

डूडाड का समाधान अधिक सुरुचिपूर्ण है। बस चर को परेशान करें: unset HISTFILE(धन्यवाद!)


5
यह सभी कमांड को लॉग इन होने से रोकेगा । यह वह नहीं है जो प्रश्नकर्ता चाहता है।
नौफाल इब्राहिम

12
यह मेरे लिए /dev/nullलॉगआउट पर 0600 पर सेट की जा रही अनुमतियों से संबंधित समस्याओं का कारण बना । इसके बजाय मैंने इस्तेमाल किया unset HISTFILE
Doodad


21

@ जॉन डोए & @ उपयोगकर्ता 3270492 के उत्तर का विस्तार। लेकिन, यह मेरे लिए काम करने लगता है।

<your_secret_command>; history -d $((HISTCMD-1))

आपको अपने इतिहास में कमांड की प्रविष्टि नहीं देखनी चाहिए।

यहाँ स्पष्टीकरण है ..

'इतिहास -d' इतिहास से उल्लिखित प्रविष्टि को हटा देता है।

HISTCMD अगले निष्पादित होने के लिए कमांड_नंबर को संग्रहीत करता है। तो, (HISTCMD-1) अंतिम निष्पादित कमांड को संदर्भित करता है।

बैश इतिहास फ़ाइल से एक निश्चित रेखा निकालें


दुर्भाग्य से यह मेरे लिए काम नहीं किया।
मैजिक

10

आप इतिहास के बिना एक शेल का उपयोग करने पर विचार कर सकते हैं, जैसे शायद

/bin/sh << END
   your commands without history
END

(शायद /bin/dashया /bin/sashअधिक से अधिक उपयुक्त हो सकता है /bin/sh)

या इससे भी बेहतर बैच उपयोगिता का उपयोग करें

batch << EOB
   your commands
EOB

तब इतिहास समाहित होगा shया batchजो बहुत सार्थक नहीं है


8

आप अपना सत्र शुरू कर सकते हैं

export HISTFILE=/dev/null ;history -d $(history 1)

फिर अपने डरपोक कार्यों के साथ आगे बढ़ें। Histfile स्थापना करने के लिए /dev/nullइतिहास फाइल करने के लिए लॉग इन किया जाएगा, अभी तक इस प्रविष्टि आसानी से हटा दिया जाएगा और (इतिहास फ़ाइल में कम से कम) कोई निशान नहीं दिखाई जाएगी।

इसके अलावा, यह गैर-स्थायी है।


यह पहले से ही कई बार जवाब था। आप क्या कहेंगे कि आपका उत्तर इस धागे को जोड़ता है (बेकार शोर को छोड़कर)?
gourourf_gniourf

इसे एक उत्तर में एक साथ नहीं रखा गया था , ताकि इतिहास में खुद को दिखाने के लिए कमांड न हो और इसके बाद ऐसा कुछ भी न दिखे जो इसमें दर्ज हो।
क्रिश्चियन

1
लेकिन अब यह धागा एक वास्तविक गड़बड़ है! इस मामले में, विशेष रूप से इस तरह के एक पुराने सवाल के लिए, मेरा मानना ​​है कि यह बेहतर है कि आप पहले से मौजूद अच्छे उत्तरों को संपादित करें, और / या एक टिप्पणी छोड़ें ...
gniourf_gniourf

5

जैसा कि टिप्पणियों में डूडाड द्वारा उल्लेख किया गया है , unset HISTFILEयह अच्छी तरह से करता है, लेकिन अगर आप भी कुछ इतिहास हटाना चाहते हैं, तो echo $HISTFILEइतिहास फ़ाइल स्थान (आमतौर पर ~/.bash_history) प्राप्त करने के लिए unset HISTFILEकरें, और संपादित करें ~/.bash_history(या जो कुछ भी HISTFILEथा - बेशक यह अब unsetआप ऐसा कर सकते हैं ' t इसे पढ़ें)।

$ echo $HISTFILE       # E.g. ~/.bash_history
$ unset HISTFILE
$ vi ~/.bash_history   # Or your preferred editor

फिर आपने अपना इतिहास संपादित किया है, और यह तथ्य कि आपने इसे संपादित किया है!


इस पर कोशिश की: GNU बैश, संस्करण 3.2.57 (1) -release (x86_64-apple-darwin15) और यह काम नहीं करता है। परेशान इतिहास के बाद मैंने जिन आदेशों का इस्तेमाल किया, वे ~ / .bash_history में संग्रहीत थे
क्रिस्टियन

@ क्रिस्टियन मेरी गलती - मैंने "अनसेट हिस्टरी" तब लिखा था जब इसे "अनसेट हस्टीमर" होना चाहिए - सही। क्या अब यह काम करता है? यह GNU बैश, संस्करण 4.3.30 (1) -release (x86_64-pc-linux-gnu) पर काम करता है।
२०:४० बजे drkvogel

अच्छा मुझे यकीन नहीं है सिंपल टेस्ट: unset HISTFILE; echo TEST; historyआपको echo TESTपिछले से लास्ट तक कमांड देगा । हालांकि सत्र को समाप्त करने और फिर से जोड़ने के बाद, इतिहास में वास्तव में यह प्रविष्टि नहीं है। इसलिए मैं कहूंगा कि यह काम करता है :)
क्रिस्टियन

unset HISTFILEस्मृति में इतिहास में दर्ज किए जा रहे आदेशों को रोकना प्रतीत नहीं होता है, लेकिन यह उन्हें जो भी फ़ाइल $ HISTFILE में दर्ज किया जा रहा है, उसे रोक देता है। इसलिए मुझे लगता है कि आपके पास अभी भी स्मृति में आपका स्थानीय इतिहास है, लेकिन यह अब एक फ़ाइल में दर्ज नहीं किया जा रहा है, जो कि आप चाहते हैं! ;)
drkvogel

4

आप निम्न कमांड का भी उपयोग कर सकते हैं:

echo toto; history -d $(history | sed -n '$s/\s*\([0-9]*\)\s*.*$/\1/p')

मुझे लगता है कि यह बहुत पोर्टेबल कमांड है।


मैंने इससे उर्फ ​​बनाया है: alias forget="history -d $(history | sed -n '$s/\s*\([0-9]*\)\s*.*$/\1/p')"और अब आप इसे कुछ इस तरह से कर सकते हैं:mysql -uroot -pSecretPassword ; forget
sobi3ch

1
क्षमा करें, लेकिन मुझे पता है कि उद्धरण के कारण $sऔर अन्य चीजों के अर्थ में परिवर्तन करने के लिए आपको उपनाम के बजाय फ़ंक्शन बनाने की आवश्यकता है । function forget() { // put code here // }
sobi3ch

3

यदि आप zsh का उपयोग कर रहे हैं तो आप चला सकते हैं:

setopt histignorespace

यह सेट होने के बाद, एक स्थान से शुरू होने वाले प्रत्येक कमांड को इतिहास से बाहर रखा जाएगा।

इसे चालू / बंद करने के लिए आप उपनाम का उपयोग कर सकते हैं :.zshrc

# Toggle ignore-space. Useful when entering passwords.
alias history-ignore-space-on='\
setopt hist_ignore_space;\
echo "Commands starting with space are now EXCLUDED from history."'

alias history-ignore-space-off='\
unsetopt hist_ignore_space;\
echo "Commands starting with space are now ADDED to history."'

अच्छा है, लेकिन इस सवाल का विशेष रूप से टैग है बैश
tripleee

2

इसे प्राप्त करने के कई तरीके हैं। यह इतिहास फ़ाइल का आकार 0 पर सेट करता है:

export HISTFILESIZE=0

यह इतिहास फ़ाइल को /dev/nullप्रभावी रूप से अक्षम करने के लिए सेट करता है:

export HISTFILE=/dev/null

अलग-अलग कमांड के लिए, आप कमांड को एक स्थान के साथ उपसर्ग कर सकते हैं और इसे इतिहास फ़ाइल में सहेजा नहीं जाएगा। ध्यान दें कि इसके लिए आपको पर्यावरण चर (मैन बैश और अधिक विवरण के लिए खोज ) ignorespaceमें शामिल मूल्य की आवश्यकता है ।$HISTCONTROLignorespace


2
यह सभी कमांड को लॉग इन होने से रोकेगा । यह वह नहीं है जो प्रश्नकर्ता चाहता है।
नौफाल इब्राहिम

खैर, मैंने यह मान लिया कि प्रश्नकर्ता जो कुछ भी करना चाहता था, उसे करने के बाद मूल्यों को रीसेट कर देगा, जिसे लॉग नहीं किया जाना चाहिए।
PGL

1

यह आसान है यदि आप सभी इतिहास को मिटाना चाहते हैं, इस तथ्य सहित कि आपने सभी इतिहास को मिटा दिया है!

rm .bash_history;export HISTFILE=/dev/null;exit

0

आपको बस चलाने की आवश्यकता है:
$ set +o history

अधिक देखने के लिए, दौड़ें:
$ man set


2
यह सभी भविष्य के आदेशों के लिए इतिहास को अक्षम करता है, न कि किसी व्यक्तिगत आदेश के लिए। यहां आने वाले अधिकांश लोगों को इसके बजाय स्वीकृत उत्तर को देखना चाहिए।
त्रिवेणी tri ’

यह मान्य है, या ठीक है लेकिन अधूरा है। जब तक हम रिवर्स कमांड को set -x historyबाद में जोड़ते हैं , तब तक यह काम करता है।
अब्दिललाह

0

यह कमांड काम आ सकता है। यह निष्पादित की गई कमांड को रिकॉर्ड नहीं करेगा

history -d $((HISTCMD-1)) && <Your Command Here>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.