स्थानीय कंप्यूटर पर और ssh सत्र में अलग से $ PS1 सेट करें


9

मैं अपने होम डायरेक्टरी को संस्करण नियंत्रण में रखता हूं, ताकि मेरा बेसिक कॉन्फ़िगरेशन किसी भी कंप्यूटर पर आसानी से उपलब्ध हो सके।

मेरे स्थानीय कंप्यूटर पर मेरा बैश कमांड प्रॉम्प्ट एक जटिल, रंगीन चीज़ है जिसमें वर्तमान गिट रिपॉजिटरी और इसकी स्थिति शामिल है। लेकिन user@host ~ $जब मैं sshएक रिमोट मशीन में होता हूं तो मुझे एक साधारण कमांड प्रॉम्प्ट होता है ।

मैं अपने अपडेट करने में सक्षम होना चाहता हूं .profileताकि यह $PS1स्थानीय स्तर पर चलने के दौरान एक जटिल हो और एक sshसत्र में चलने पर एक सरलीकृत हो ।

मूल रूप से, मैं $AM_I_LOGGED_IN_VIA_SSHअपने में परीक्षण करने के लिए एक चर की तरह कुछ चाहूंगा .profile। क्या यह संभव है?

जवाबों:


8

जब आप SSH के माध्यम से लॉगिन करते हैं, तो कई अतिरिक्त पर्यावरण चर सेट हो जाते हैं। आप अपने PS1 को अपने .profile में सेट करने के लिए परीक्षण के रूप में उपयोग कर सकते हैं।

if [ -n "$SSH_CLIENT" ]; then
    PS1="Via ssh: "
else
    PS1="Local: "
fi

7

आप अपने वातावरण को चेक करते हैं ( env | grep SSH) आप इस तरह के रूप में कई उम्मीदवारों मिल जाएगा $SSH_CLIENT, $SSH_CONNECTIONऔर $SSH_TTY; सटीक सूची sshdसंस्करण पर निर्भर करेगी ।


2

यदि आपका sshd उपयोगी चर प्रदान नहीं कर रहा है, तो आप उपयोग कर सकते हैं

ps -p $PPID

या कुछ अन्य यादृच्छिक पीएस ट्रिक (यदि आपका शेल सेट नहीं होता है $PPID) तो यह देखने के लिए कि शेल की मूल प्रक्रिया आपकी रिमोट-लॉगिन-प्रक्रिया है या नहीं। फिर अगर पेरेंट-इज़-रिमोट-थेली स्विच $ पीएस 1 है। और फिर OpenSSH डाउनलोड करें और geekosaur / Caleb के सुझावों का उपयोग करें क्योंकि आपका ssh सर्वर जंक है। ;)

या, आप "मैं कौन हूं" के आउटपुट का उपयोग कर सकता हूं, अंतिम फ़ील्ड (यानी, $( who am i | awk '$0=$NF')) को पकड़ सकता हूं , और यह देखने के लिए जांचें कि क्या होस्ट दूरस्थ या स्थानीय है या नहीं, यह तय करने के लिए कि क्या आप स्थानीय या दूरस्थ रूप से लॉग इन हुए हैं।

या आप $(hostname)अपने शेल को विशिष्ट होस्ट पर उपयुक्त $ PS1 का उपयोग करने के लिए आउटपुट पर स्विच कर सकते हैं ।

या, चलो वास्तव में पागल हो जाते हैं। यदि आप एक आधुनिक शेल का उपयोग कर रहे हैं - जैसे बैश, ksh93, या zsh, तो आप इस तथ्य का लाभ उठा सकते हैं कि निष्पादन पर $ PS1 का पुनर्मूल्यांकन किया जाता है। तो, यदि आप अपने cwd रिपॉजिटरी के भीतर है, और बाहर कुछ और है पागल पागल सामान करने के लिए एक इनलाइन सशर्त ब्लॉक शामिल कर सकते हैं। उदाहरण के लिए, यहां मैं [[ conditional ]] && $( echo "whatever it should be if true) || $( echo "whatever should be the if-not-true prompt" )मूल रूप से उपयोग कर रही निर्देशिका के आधार पर अपना त्वरित परिवर्तन कर रहा हूं ।

default prompt$ PS1='$(id -un) @ $(hostname)$( [[ $(pwd) = /tmp ]] && echo " [I am in /tmp]" || echo " /not/in/tmp")$ '
myname @ host /not/in/tmp$ cd /tmp
myname @ host [I am in /tmp]$ cd /etc
myname @ host /not/in/tmp$

निश्चित रूप से, $ PS1 की परिभाषा आपके प्रोफ़ाइल में पागल दिखेगी, लेकिन आप तब केवल सुपर-रंगीन-गिट-सामान प्राप्त करते हैं जब आप वास्तव में गिट रिपॉजिटरी में होते हैं, जबकि आप कहीं और नियमित रूप से रंग देते हैं। :) ध्यान दें कि आपको PS1 असाइनमेंट के आसपास सिंगल कोट्स का उपयोग करना है। जब PS1 को असाइन किया गया हो तो आप वैरिएबल का विस्तार नहीं चाहते हैं; जब $ PS1 का मूल्यांकन बाद में किया जाता है तो आप उन्हें विस्तारित करना चाहते हैं। तो, एकल-उद्धरण।


1

यदि PermitUserEnvironmentsshd में सक्षम है तो आप ~/.ssh/environmentबनाने के लिए उपयोग कर सकते हैं $PS1और फिर अपनी स्क्रिप्ट में एक मूल्य की उपस्थिति का पता लगा सकते हैं जो सामान्य रूप से सेट करता है।


0

इग्नासियो के जवाब के अलावा, चीजों को स्पष्ट करने के लिए, काम करने के लिए PermitUSerEnvironmentविकल्प को सर्वर साइड पर सक्षम किया जाना चाहिए। यदि सर्वर इस विकल्प को सक्षम नहीं करता है, तो आपके पास उस सर्वर के साथ रंगीन ssh सत्र नहीं होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.