ग्राहक से प्रिंटिंग मोट से लॉगिन ssh को रोकें?


44

मुझे SSH पासवर्ड रहित मिल गया है, हालाँकि यह लॉग इन करते समय MoTD को प्रिंट करता है। क्या ग्राहक की तरफ से ऐसा होने से रोकने के लिए कोई उपाय है?

मैंने कोशिश की है, ssh -qलेकिन वह काम नहीं करता है। मैं उपयोग नहीं करना चाहता और ~/.hushloginन ही मैं सर्वर सेट अप बदलना चाहता हूं। केवल एक चीज जो काम कर सकती है वह है सभी आउटपुट को शांत करना, साथ >/dev/null 2>&1। हालाँकि, मैं वास्तव में एक समस्या होने पर त्रुटियों को अनदेखा नहीं करना चाहता। यहां तक ​​कि काम >/dev/nullभी नहीं करता है, क्योंकि sshस्टेटर को मोटर्ड प्रिंट करना लगता है।

अद्यतन और तर्क मैं एक क्रॉन में बैकअप चला रहा हूं। जब तक कोई त्रुटि नहीं हुई है, मैं एक क्रोन ईमेल प्राप्त नहीं करना चाहता। हालांकि अगर मोटर्ड छपा है तो मुझे हर समय ईमेल मिलेगा।

मैं चाहता हूं कि मोटिव को प्रिंट किया जाए क्योंकि इसके कानूनी निहितार्थ हैं। मोटर्ड का कहना है कि "अनधिकृत पहुंच निषिद्ध है"। कानूनी रूप से लोगों को इसे एक्सेस करने से रोकने के लिए आपको इस तरह का बयान देना होगा (जैसे कोई अतिचार नहीं)। इसलिए मैं इसे हर समय अक्षम नहीं करना चाहता।


1
क्या आप क्रोन जॉब के बारे में कुछ विवरण जोड़ सकते हैं ...
काइल ब्रांट

1
मोटिव केवल इंटरएक्टिव सत्रों के लिए मुद्रित किया जाता है। मैंने अभी इसका परीक्षण किया है, और यह ऐसा है:> $ ssh होस्ट → MOTD मुद्रित> $ ssh होस्ट ls → केवल घरेलू निर्देशिका की सामग्री प्रिंट करता है दूसरे शब्दों में, आप कुछ बहुत गलत कर रहे हैं; क्या आपने भी कोशिश की है?
niXar

यह /etc/profile.dकिसी भी स्क्रिप्ट की जांच करने के लिए भी ध्यान देने योग्य है जो वहां चल सकती है और कुछ आउटपुट को लॉगिन पर कंसोल पर प्रिंट कर सकती है।
डेव

4
क्या वास्तव में एक कानून है जो आपको "अनधिकृत पहुंच निषिद्ध" कहने की आवश्यकता है? मुझे लगा कि DMCA किसी भी प्रकार की इलेक्ट्रॉनिक प्रणाली ( चाहे वह कितनी भी बुरी तरह से संरक्षित क्यों न हो ) को तोड़ना अवैध बनाता है , इसलिए जब तक आपके पास किसी प्रकार का पासवर्ड / SSH कुंजी की आवश्यकता है, यह शुद्ध विंडो ड्रेसिंग की तरह लगता है।
निक टी

जवाबों:


58

मुझे यकीन नहीं है कि आपके पास इसे सही तरीके से करने के लिए एक फैलाव क्यों है - या तो सर्वर पर ला

PrintMotd no
PrintLastLog no

तथा

#/etc/pam.d/ssh
# Print the message of the day upon successful login.
# session    optional     pam_motd.so

या प्रत्येक उपयोगकर्ता के लिए ~ / .hushlogin जोड़ना।

संकेत, ~ / .hushlogin के लिए, इसे / etc / skel में जोड़ें ताकि फ़ाइल के साथ नए उपयोगकर्ता होम निर्देशिकाएं बनाई जाएं।

अपडेट करें:

आपके बैकअप क्रोन जॉब के बारे में अधिक जानकारी के बिना, मेरा एकमात्र सुझाव यह है कि कमांड के आउटपुट को एक फ़ाइल में पुनः निर्देशित करें (या क्रॉन को ईमेल में कैप्चर करने दें) और ssh सत्र का आउटपुट / dev / null। कुछ इस तरह:

0 0 * * * ssh backuphost "backup_script_that_writes_to_a_log" >/dev/null

या

0 0 * * * ssh backuphost "backup_command 2>&1" >/dev/null

मुझे थोड़ी सी आज्ञाओं के साथ खेलना होगा, लेकिन आपको शुरुआत करनी चाहिए।


3
मुझे "सही ढंग से करना" पसंद है।
बेनोइट

14
मैं सर्वर से इसे हटाना नहीं चाहता क्योंकि मुझे कानूनी कारणों के लिए 'अधिकृत एक्सेस निषिद्ध' नोटिस रखने की आवश्यकता है।
रोरी

3
Fwiw, नोटिस अनधिकृत पहुँच को नहीं रोकता है, यह केवल उन लोगों को सूचित करता है जिन्हें आप (और इच्छा) उचित कानूनी कार्रवाई कर सकते हैं, और उनके उपयोग की निगरानी कर सकते हैं, जैसे कि फोन पर बातचीत रिकॉर्ड करने के बारे में अधिसूचना।
jtimberman

इसके अलावा, यदि आप क्रॉन जॉब को चिपका रहे हैं तो यह बहुत मदद करेगा।
jtimberman

3
.hushloginअच्छा है
andrewtweber

16

यदि आप इसे प्रति-उपयोगकर्ता आधार पर चाहते हैं, तो बस एक करें touch ~/.hushloginऔर आप सभी OpenSSH के साथ सेट हैं।

अद्यतन : जैसा कि कहीं और बताया गया है, pam_motdप्रति-उपयोगकर्ता का उपयोग नहीं करने के लिए कॉन्फ़िगर किया जा सकता है .hushlogin; जाँच /etc/login.defsके लिए HUSHLOGIN_FILE। इसे सभी उपयोगकर्ताओं को /etc/hushloginsया समान में सूचीबद्ध करने के लिए कॉन्फ़िगर किया जा सकता है ।


2
मैंने कोशिश की, लेकिन यह काम नहीं किया। जैसा कि अन्य लोगों ने बताया है कि मोटू को पम से छापा जा सकता है
रोरी

11

@ नोट सभी उदाहरण मान लेते हैं कि आपने connectionStringकुछ के साथ एक चर सेट किया है connectionString=user@server

मैं समाधान के लिए कैसे मिला

ssh -Tसरल कमांड के लिए काम करना चाहिए। उदाहरण के लिए यह कोई अतिरिक्त जानकारी नहीं छापता है:

ssh -T $connectionString "echo 'blah'"

समस्या यह है कि जब आप कई कमांड चलाने के लिए यहां-डॉक्टर का उपयोग करने का प्रयास करते हैं। उदाहरण के लिए - bellow काम नहीं करेगा - यह दिन (MoTD) के संदेश को प्रतिध्वनित करेगा और आपको यह भी दिखा सकता है कि "stdin: is a tty"।

somethingLocal='something local'
ssh -T $connectionString <<EOC
    echo 'blah'
    echo "blah $somethingLocal"
EOC

समस्या को हल करने के लिए आपको पहले स्थानीय चर के लिए कमांड को बचाने और उन्हें दूरस्थ सर्वर पर भेजने की आवश्यकता है।

somethingLocal='something local'
read -r -d '' commands <<EOC
    echo 'blah'
    echo "blah $somethingLocal"
EOC
ssh -T $connectionString "$commands"

लेकिन यह गन्दा है ...

अंतिम समाधान

एक सार्वभौमिक कार्य करें (ध्यान दें कि यह कमांड के रूप में एक स्ट्रिंग या HEREDOC ले सकता है)।

function silentSsh {
    local connectionString="$1"
    local commands="$2"
    if [ -z "$commands" ]; then
        commands=`cat`
    fi
    ssh -T $connectionString "$commands"
}

उदाहरण

इस तरह से उपयोग करें:

somethingLocal='something local'
silentSsh $connectionString <<EOC
    echo 'blah'
    echo "blah $somethingLocal"
EOC

या ऐसा है:

silentSsh $connectionString "echo 'blah'"

या ऐसा है:

silentSsh $connectionString <<'EOC'
    echo 'blah'
    somethingRemote=`echo 'whatever'`
    echo "blah $somethingRemote"
EOC

या यहां तक ​​कि ऐसा:

silentSsh $connectionString < getlines.sh

काश इसके लिए मेरे पास और भी अपवोट्स होते। कुछ अति-स्क्रिप्चिंग का पता लगाने में बहुत सहायक जो हमें करने की आवश्यकता थी।
cxtxton

शानदार जवाब !! आपका बहुत बहुत धन्यवाद!!
स्कॉटी एच।

10

इस हैक के बारे में कैसे? ;-P

ssh -t user@machineName '/bin/bash'

निम्नलिखित मान्य नहीं है:

पासिंग -Tअक्षम tty आवंटन करने के लिए ssh करने के लिए:

ssh -T machineName 'echo foo'

3
ssh उपयोगकर्ता @ मशीन 'आपका कमांड यहाँ' वैसे भी मोटिव को प्रदर्शित नहीं करता है (यह एक इंटरैक्टिव शेल नहीं है)।
मैरी फिशर

ओह अच्छा, बिंदु ....
काइल ब्रान्ड

लेकिन इसका मतलब यह है कि "यह एक इंटरैक्टिव शेल नहीं है" क्योंकि मैंने कोशिश की थी और मैं कमांड चला सकता हूं कि मैं क्या उपयोग कर रहा हूं-t
Ciasto piekarz

कृपया ध्यान दें कि "-t" जोड़ने से व्यवहार में परिवर्तन होता है (यह आपकी TERM सेटिंग के अनुसार प्रदर्शित होता है, जरूरत पड़ने पर नियंत्रण वर्ण जोड़ता है, आदि)। यह कुछ आदेशों के परिणाम को बदल सकता है (यह छूट के लिए त्रुटियों का परिचय दे सकता है: ssh -t somehost "tar cf - कुछ फाइलें"> local.tar # यहाँ -t का उपयोग न करें ... खासकर यदि आप एक यूनिक्स होस्ट से ssh करते हैं। एक विंडोज़ एक। लेकिन अन्य मामलों में कई अन्य समस्या पैदा हो सकती है)। अद्भुत @StephaneChazelas उत्तर देखें: unix.stackexchange.com/questions/151916/…
ओलिवियर

3

यह किस ऑपरेटिंग सिस्टम है? कुछ सिस्टमों पर (जैसे ubuntu) motd ssh सर्वर (PrintMotd in / etc / ssh / sshd_config) द्वारा प्रिंट नहीं किया जाता है, लेकिन pam_motd के साथ pam द्वारा। अगर ऐसा है तो आप शायद इसे ग्राहक से नियंत्रित नहीं कर सकते।


आप इसे ssh क्लाइंट में नियंत्रित नहीं कर सकते, लेकिन आप ग्राहक की ओर से सुनिश्चित कर सकते हैं :) .. विवरण के लिए मेरा उत्तर देखें
drAlberT

नहीं, आपने एक बहुत ही दिलचस्प / चतुर हैक का प्रस्ताव किया है, जो कि ग्राहक द्वारा छापे जाने से रोकने के लिए एक समाधान है, जो प्रश्न द्वारा मुद्रित नहीं किया गया है।
Theotherreceive

2

आपको इसे सर्वर पर करना होगा:

PrintMotd no
PrintLastLog no

डेबियन / ubtuntu पर भी pam_motd.so के साथ लाइन हैश:

#/etc/pam.d/ssh
# Print the message of the day upon successful login.
# session    optional     pam_motd.so

नहीं, तुम नहीं। नीचे काइल ब्रांट का जवाब देखें।
स्टोबोर

-1 - उत्तर संपादित प्रश्न को प्रतिबिंबित नहीं करता है। अब प्रासंगिक नहीं है।
रोमन्दास

2

सीधे क्रॉन द्वारा ssh कमांड निष्पादित न करें।

इसके बजाय एक सहायक बैश स्क्रिप्ट बनाएं , ssh जॉब को निष्पादित करें और यदि आवश्यक हो तो आउटपुट, त्रुटियों और त्रुटि कोड को लाएं; अंततः त्रुटि संदेशों (आपके मामले में MoTD) से अवांछित तारों को हटाने के लिए उन्हें पार्स करें और फिर बैश स्क्रिप्ट आउटपुट और त्रुटि स्ट्रीम पर प्रिंट करें जो आपने इस तरह से प्राप्त किया है।

इस बकवास स्क्रिप्ट को क्रोन में रखें और खुश रहें :)

नोट: यह एक सामान्य समाधान है, और आपको जो भी काम करना है उसे ssh के माध्यम से करना होगा। यह केवल क्लाइंट पक्ष है, जिसे आपकी आवश्यकताओं को पूरा करना चाहिए ... सर्वर कॉन्फिगर पर क्लाइंट की एकमात्र निर्भरता उस सटीक संदेश का ज्ञान है जिसे आप std से गलत तरीके से या ssh क्लाइंट से बाहर निकालना चाहते हैं।


2
यह एक समाधान नहीं है जो एक समाधान है।
niXar

मैं आपसे माफी नहीं मांग सकता। IMHO है कि जिस तरह से चीजों को साफ-सुथरा किया जाना चाहिए ... अगर मैं स्पष्ट रूप से ssh क्लाइंट को स्पष्ट रूप से कॉन्फ़िगर करने के लिए एक तरीका था, तो मैं आपसे सहमत हूं, लेकिन यह मौजूद नहीं है, क्योंकि यह sshd नियंत्रण में नहीं है !
drAlberT

2

बस एक सिडेनोट (एक टिप्पणी होगी, अगर मैं वह पोस्ट कर सकता था): सिस्टम में सफल लॉगिन के बाद मोटर्ड के विषय दिखाए जाते हैं । अगर मैं कानूनी तौर पर लोगों को एक बॉक्स तक पहुँचने से रोकना चाहूँ तो मैं sshd_config में एक "बैनर" द्वारा करूँगा। उपयोगकर्ता नाम दर्ज करने के बाद लेकिन प्रमाणित करने से पहले सामग्री प्रदर्शित की जाती है।


4
हाँ, लेकिन आप ssh क्लाइंट पर -q का उपयोग करके बैनर को निष्क्रिय कर सकते हैं, इसलिए मैं आपके नोट से सहमत नहीं हो सकता
drAlberT

1
ओह लड़का, मैं इसे पूरी तरह से देख सकता हूं, "-q" ने डेनाकॉर्प इंक के लिए काम करने वाली दरार कानूनी टीम के पूरे बचाव को हरा दिया है। उन्होंने इसे आते नहीं देखा था। असली लें। यदि कोई ऐसा व्यक्ति जो बैनर को देखना चाहता है, तो उद्देश्यपूर्ण रूप से इसे विकसित करता है ... बैनर अभी भी बाध्यकारी है, क्योंकि आपको इसे खाली करने के लिए जानना था।
niXar

2

या तो आपने कोशिश नहीं की है कि आप क्या वर्णन कर रहे हैं, या आपके सर्वर गलत तरीके से कॉन्फ़िगर किए गए हैं!

यहाँ मैं सिर्फ RHEL5 पर कोशिश की है:

workstation ~ $ ssh root@server
server ~ # echo "MOTD" > /etc/motd
server ~ # ^D
workstation ~ $ ssh root@server
MOTD
server ~ # ^D
workstation ~ $ ssh root@server echo notice the lack of motd
notice the lack of motd
workstation ~ $ 

मुझे नहीं लगता कि आपको गैर-संवादात्मक गोले भेजे जाने के लिए अस्वीकरण की आवश्यकता है, क्या आप? (यदि कोई दावा करता है कि आप मुझ पर एक एहसान करते हैं, तो उन्हें पागल कर दें।) क्योंकि यही कारण है कि इंटरैक्टिव गोले और गैर-संवादात्मक के बीच अंतर है।

लेकिन किसी भी मामले में, मैं यहाँ क्या करता हूं क्योंकि मुझे क्रोन से मेल पसंद नहीं है: मैं आउटपुट को लकड़हारा पर भेजता हूं। अपने पहले (जैसे 3 कहो) पंक्तियों को हटाने के लिए इसे पूंछ के माध्यम से पाइप करें (जैसे अनुपलब्ध कोड, मुझे अपनी स्क्रिप्ट तक पहुंच नहीं है):

( tail -n +3 | logger -i -t mycronjob -s -p cron.crit ) <&6 &
exec 2>&6
cron_fsckin_job

यदि आप आदमी sshd में देखते हैं, तो आप देखेंगे कि यह कहता है: लॉगिन प्रक्रिया और / etc / motd (जब तक कॉन्फ़िगरेशन फ़ाइल में या ~ / .hushlogin द्वारा रोका नहीं जाता है; FILES अनुभाग देखें)। 2. "ध्यान दें कि अगर ssh लॉगिन में कोई कमांड दर्ज की गई है, तो कोई MOTD प्रदर्शित नहीं होता है
katriel

मुझे पता है, कि मैं क्या प्रदर्शन कर रहा था। अापका नजरिया क्या है?
niXar

1

अगर मैं आपको समझता हूं, तो आपको अन्य कारणों के लिए motd की आवश्यकता है लेकिन बैकअप के लिए motd की आवश्यकता नहीं है। Sshd के विन्यास में इसे केवल विश्व स्तर पर उपयोगकर्ता के आधार पर सेट नहीं किया जा सकता है। इसलिए आपको क्लाइंट साइड में मोटिव सप्रेशन को हल करने की आवश्यकता है। लेकिन motd के टेक्स्ट और बैकअप सॉफ्टवेयर के एरर मैसेज में कोई अंतर नहीं है। दोनों टर्मिनल में पाठ हैं। एकमात्र समाधान जो मुझे इस दो संदेश के बीच अंतर करने के लिए दिखाई देता है, फिर motd के एक को फ़िल्टर करें। क्योंकि सॉफ्टवेयर के संदेशों को संशोधित करना मुश्किल है, मैं मोटिव के पाठ को संशोधित करने का सुझाव देता हूं। उदाहरण के लिए चारों ओर एक फ्रेम रखो:

*** BEGIN message from the machine room ***

motd message

*** END message from the machine room ***

फिर आपको फ़्रेम के बीच पाठ को फ़िल्टर करना चाहिए और इसे छोड़ देना चाहिए।


1

यहां हल:

यदि आप सर्वर के प्रभारी नहीं हैं और आप motd या sshd config को नहीं बदल सकते हैं, तो निम्न की तरह कमांड का उपयोग करें:

दूरस्थ कमांड (एस) के लिए STDERR को एसटीडीआर पर पुनर्निर्देशित करें ताकि आप इसे देखेंगे। और फिर ssh / / null में ssh के STDERR को रीडायरेक्ट करें। MOTD STERR में जाता है और / dev / null में समाप्त होता है। दूरस्थ कमांड से कोई मानक और त्रुटि संदेश दिखाया जाएगा (जैसा कि यह STDOUT को जाता है)

वेरिएंट 1 - यदि आप दूरस्थ रूप से निष्पादित कमांड की निकास स्थिति की परवाह करते हैं:

ssh remotehost "(remote_command1 && remote_command2; remote_command3) 2>&1" 2>/dev/null || echo SSH connection or remote command failed - either of them returned non-zero exit code $?

वेरिएंट 2 - यदि आप रिमोट कमांड के निकास कोड को अनदेखा करना चाहते हैं - तो अंतिम रिमोट कमांड के रूप में सही निष्पादित करें

ssh remotehost "(remote_command; true) 2>&1" 2>/dev/null || echo SSH connection failed

त्रुटि संदेशों के उदाहरण:

उदाहरण 1:

ssh रिमोटहॉस्ट " विफल_ रिमोट_कम 2> और 1" 2> / देव / अशक्त || इको एसएसएच कनेक्शन विफल या दूरस्थ कमांड नॉन-जीरो एग्जिट कोड बैश लौटा
 : विफल_्रेमोट_कमांड: कमांड नहीं मिला
SSH कनेक्शन या रिमोट कमांड विफल - उनमें से कोई भी गैर-शून्य निकास कोड 127 लौटाया

उदाहरण 2:

ssh Remotehost " विफल_ Remote_command 2> & 1; असली " 2> / देव / अशक्त || इको एसएसएच कनेक्शन विफल
 बैश: विफल_्रेमोट_कमांड: कमांड नहीं मिला

उदाहरण 3a:

ssh Remotehost " विफल_ Remote_command 2> & 1; असली" 2> / देव / अशक्त || इको एसएसएच कनेक्शन विफल
 # कोई संदेश नहीं दिखाया गया है

उदाहरण 3 बी:

ssh nonexistinghost " failed_ 2 remote_command> & 1; सच" 2> / dev / बातिल || इको एसएसएच कनेक्शन विफल
 एसएसएच कनेक्शन विफल रहा

0

क्या आपने मोटड फ़ाइल में पाठ को हटाने की कोशिश की है? सिर्फ एक विचार।

Hint: /etc/motd

4
उन्होंने कहा कि क्लाइंट की ओर से, सर्वर साइड सेटिंग से PrintMotd को sshd_config में नहीं, शायद बेहतर होगा
काइल

0

आप क्या करने की कोशिश कर रहे हैं और MoTD आपको परेशान क्यों करता है? मैं एक दूरस्थ कमांड निष्पादित करने और आउटपुट पार्स करने का अनुमान लगा रहा हूं? यदि ऐसा है, तो यह एक इंटरेक्टिव शेल को लागू किए बिना कई तरीकों से किया जा सकता है (जो कि प्रेरित होने का कारण बनता है)।


ओह, जैसे? मैं वास्तव में ssh विचार का उपयोग करना चाहता हूँ ..
Rory

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