سؤال عند استخدام ssh'ing ، كيف يمكنني تعيين متغير بيئة على الخادم يتغير من الجلسة إلى الجلسة؟


عندما ssh في الخادم ، كيف يمكنني تمرير متغير بيئة من العميل إلى الخادم؟ يتغير متغير البيئة هذا بين الدعوات المختلفة لـ ssh ، لذا لا أريد الكتابة فوق $HOME/.ssh2/environment في كل مرة أقوم بإجراء مكالمة ssh. كيف يمكنني أن أفعل هذا؟


82
2017-07-13 16:59


الأصل


أنت سؤال يجب أن يكون أكثر خصوصية. - Ignacio Vazquez-Abrams
كان السؤال واضحا بما فيه الكفاية بالنسبة لي. ومع ذلك ، من ssh man page ، لا أرى أي طريقة للقيام بذلك بخلاف إعداد المتغير يدويًا بمجرد تسجيل الدخول إلى الخادم ، ما لم تقم بتعديل ~ / .ssh2 / environment. - garyjohn
هل هو متغير مختلف في كل مرة؟ أو قيمة مختلفة؟ - Dennis Williamson
ممكن نسخة من كيف يمكنني تمرير متغير بيئة من خلال أمر ssh؟ - Tonin
طريقة أخرى ، لأن هذا هو بالفعل أكثر شعبية. لا يهم انه كبار السن. - kenorb


الأجوبة:


بالطبع ، يمكنك ضبط متغير البيئة داخل الأمر ، ولكن يجب عليك توخي الحذر بشأن الاقتباس: تذكر أن shell الخاص بك سيقوم بتحليل سطر الأوامر المحلي الخاص بك ، ومن ثم ستحصل shell البعيد على السلسلة الموجودة به يتلقى.

إذا كنت تريد أن يحصل المتغير على نفس القيمة على الخادم الذي لديه على العميل ، جرب SendEnv اختيار:

ssh -o SendEnv = myVAR server.example.com mycommand

هذا يتطلب دعم من الخادم ، على الرغم من. مع OpenSSH ، يجب أن يكون اسم المتغير مصرحًا به /etc/sshd_config.

إذا كان الخادم يسمح فقط بأسماء متغيرات محددة معينة ، يمكنك حل ذلك ؛ على سبيل المثال يسمح الإعداد المشترك LC_* من خلال ، ويمكنك القيام بما يلي:

ssh -o SendEnv = LC_MYVAR server.example.com 'MYVAR = $ LC_MYVAR؛ غير مخصص LC_MYVAR؛ تصدير MYVAR. الامر الخاص بى'

حتى لو LC_* ليس خيارا ، يمكنك تمرير المعلومات في TERM متغير البيئة ، والذي يتم نسخه دائمًا (قد يكون هناك حد للطول). لا يزال عليك التأكد من أن الصدفة البعيدة لا تقيد TERM متغير لتعيين نوع محطة معروفة. مرر ال -t الخيار ل ssh إذا لم تكن قد بدأت شل تفاعلي عن بعد.

env TERM = "معلومات إضافية: $ TERM" ssh -t server.example.com "MYVAR = $ {TERM٪: *}؛ TERM = $ {الأجل ## *:}؛ تصدير MYVAR. الامر الخاص بى'

الاحتمال الآخر هو تحديد المتغير مباشرة في الأمر:

ssh -t server.example.com 'export MYVAR = "معلومات إضافية"؛ الامر الخاص بى'

وبالتالي ، في حالة تمرير متغير محلي:

ssh -t server.example.com 'export MYVAR =' "'$ LOCALVAR'" '؛ الامر الخاص بى'

ومع ذلك ، حذار من تحديد المسائل: سيتم تقريب قيمة المتغير مباشرة إلى مقتطف shell الذي يتم تنفيذه على الجانب البعيد. المثال الأخير أعلاه يفترض ذلك $LOCALVAR لا يحتوي على أي علامات اقتباس مفردة (').


98
2017-07-13 19:25



شكرا جزيلا ، كنت في حالة غضب أن يتم تصدير المتغيرات LC_ * غبية على سه وإجابتكم إجابتي إلى أين تبحث. أنا فقط يجب تعطيل ذلك في ~ / .ssh / config - akostadinov
أنا في حالة الملصق الأصلي ، ولكن المتغير الذي أردت إعادة توجيهه هو TERM ، لذا فأنا في حيرة من أمر جوابك. هل تم تعطيل إعادة التوجيه التلقائي لـ TERM بواسطة إصدارات OpenSSH الأخيرة؟ - Doub
Doub الافتراضي هو رفض كافة متغيرات البيئة على جانب الملقم ، مع AcceptEnv التوجيهات في sshd_config حسب المطلوب من قبل المسؤول. لكن TERM يعالج خصيصا ، بقدر ما أعرف لا توجد طريقة لتصفية ذلك على جانب الخادم (يتم تعيينه في بيئة shell بغض النظر عن أي إعداد التكوين). هل أنت متأكد من عدم وجود نص برمجي خاص بالمتصفلين يتجاوزه (مثل /etc/profile أو ~/.profile أو ~/.bashrc)؟ - Gilles
Gilles: لقد قمت باختباره مرة أخرى ، وما لم أقم بإضافة TERM بشكل صريح إلى أمر AcceptEnv الخاص بي ، فلن يتم تمرير TERM. لا يمكنني فتح shell ، ولكن تشغيل أمر مباشرة ، على سبيل المثال: "ssh -o SendEnv = TERM shell.example.com env". أن يطبع كل متغير البيئة ، و TERM يظهر فقط إذا كان في SendEnv على العميل و AcceptEnv على الخادم. إذا قمت بتشغيل "ssh -o SendEnv = TERM shell.example.com echo \ $ {TERM}" withoug في AcceptEnv أو SendEnv ، فإنه يطبع "غبي" ، وأنا لست متأكداً من أين يأتي (env لا حتى قائمة TERM في هذه الحالة). - Doub
Doub أوه ، فهمت. TERM يتم إرسالها فقط إذا طلب العميل الخادم لتخصيص tty. إذا لم يكن هناك أي طرف على الجانب البعيد ، فسيكون من غير المجدي إرساله TERM. عند تحديد أمر ، إذا كنت تريد أن يكون لديك محطة على الجانب البعيد ، تحتاج إلى -t خيار سطر الاوامر (او RequestTTY في ~/.ssh/config). - Gilles


إذا تمكنت من إدارة المضيف المستهدف ، فيمكنك تكوين sshd للسماح بتمرير متغيرات البيئة المحلية الخاصة بك إلى جانب المضيف المستهدف.

من صفحة رجل sshd_config:

 PermitUserEnvironment
     Specifies whether ~/.ssh/environment and environment= options in
     ~/.ssh/authorized_keys are processed by sshd.  The default is
     "no".  Enabling environment processing may enable users to bypass
     access restrictions in some configurations using mechanisms such
     as LD_PRELOAD.

تكوين sshd يعيش عادة في /etc/ssh/sshd_config


12
2018-02-03 17:09



من المفيد جدًا معرفة أنه تم تعيين هذا على "لا" افتراضيًا! - jathanism


لذلك ، على العميل الخاص بك ، لديك بعض متغير البيئة ، وتريد أن تكون متاحة للأمر البعيد؟ لا أعتقد أن هناك طريقة لتمرير ssh بطريقة سحرية ، ولكن ربما يمكنك فعل شيء كهذا. بدلاً من استخدام ، قل:

ssh remote.host my_command

انت تستطيع فعل ذالك:

ssh remote.host env ENV_VAR=$ENV_VAR my_command

6
2017-07-13 17:52



"المحتمل"؟ أتمنى أن أقرأ ذلك قبل محاولة هذه الإجابة. لم يعمل لي. - tishma
العناية بالتفصيل على أي أخطاء وردت ، وما إلى ذلك؟ - pioto
pioto قد يقتبس ، على سبيل المثال إذا كان لدى ENV_VAR فراغات فيه - Martin C. Martin
على Mac ، يجب أن يكون لديك خيار -t لإصدار تفاعلي ، وإلا فإنه يبدو عالقاً. لذلك قد يعمل هذا: $ ssh -t remote.host env ENV_VAR = $ ENV_VAR my_command - muenalan


لقد قادني رد فعل emptyset (الذي لم يعمل من أجلي) إلى هذا الجواب:

يمكنك إضافة هذا الأمر إلى حسابك ~/.ssh/authorized_keys ملف:

command="/usr/bin/env VARIABLE=<something> $SHELL" ssh-rsa <key>

export VARIABLE=<something> كان على الفور الخروج ، وكان اتصال SSH مغلقة (قفل لي من الخادم) ، في حين /usr/bin/env ... $SHELLسيتم تشغيل shell الافتراضي الخاص بك مع بيئة معدلة.


2
2018-05-14 14:36



هذا فقط توقف عند تسجيل الدخول بالنسبة لي. عندما أقوم بإزالته ، تعود SSH إلى وضعها الطبيعي ، وأحصل على شل تسجيل الدخول المعتاد. - Nick Sweeting
NickSweeting لقد حاولت ربما استبدال $SHELL مع قذيفة الفعلية؟ تحقق أيضًا من وجود / usr / bin / env على الخادم. ومع ذلك ، فإن الحل ليس مثاليًا: لقد لاحظت تعليقه عندما أردت استخدامه scp أو أمر مضمن. - madprog
نعم ، هذا هو أول شيء حاولت. للأسف لم يحصل على العمل ، انتهى التمكين PermitUserEnvironment yes واستخدام environment="..." بدلا من command="...". - Nick Sweeting


يمكنك محاولة استدعاء أمر مخصص ، بافتراض أنه لديك إعداد تسجيل دخول ssh بدون كلمة مرور. على الخادم ، قم بتحرير إدخال ~ / .ssh / authorized_keys الخاص بك الذي يتوافق مع المفتاح من العميل:

command="export VARIABLE=<something>" ssh-rsa <key>

ينظر الى هذا الرابط في القسم القيادة القسريه لمزيد من التفاصيل.


1
2017-07-13 17:15



جربت هذا ، لكنه لا يعمل. يتم تشغيل الأمر ومخارج ، لذلك لا توجد جلسة تفاعلية. هل هذا هو السلوك الطبيعي؟ إذا كان الأمر كذلك ، فقد يكون ذلك مفيدًا إذا كان كل ما تريد فعله هو السماح لمفتاح محدد بتشغيل أمر محدد ، ولكن إذا كنت تريد تمرير المعلومات يستخدم في جلسة (كما يقول السؤال) فإنه لا جدوى لهذا الغرض. لا توجد جلسة. - iconoclast


كنت أقوم بإنشاء بنية مخصصة من OpenSSH لجهاز يحتوي على cramfs في الدليل الرئيسي و / etc (Cram FS للقراءة فقط) حتى ~ / .ssh / بيئة لن تعمل بدون إعادة بناء FS بالكامل وقد تم نشر هذه الحقول الأجهزة (الأنظمة المدمجة ومن هنا استخدام CRAMFS). يمكنك تحديد في ملف sshd_config موقع ملف authroized_keys لكن لسبب ما ، البيئة = تعمل فقط لمتغيرات البيئة في ~ / .ssh / authroized_keys. لم يكن تحرير الملف / etc / profile خيارًا ولا بد لي من تحميل ssh في دليل غير قياسي. في session.c بعد child_set_env (... "MAIL" ...) فقط أضف متغيرات البيئة التي تحتاج إليها (هذا هو الإختراق الذي أعرفه ...) ولكن فقط طارئ شخص ما يحتاج إلى بعض envs ضمنية لجلسة إذا كنت تجميع من المصدر يمكنك القيام بذلك. TGI-FLOSS


1
2017-08-28 16:55