it-swarm.asia

كيف يمكنني تمرير متغير بيئة من خلال أمر ssh؟

كيف يمكنني تمرير قيمة إلى أمر ssh ، بحيث تبدأ البيئة التي يتم تشغيلها على الجهاز المضيف مع متغير بيئة معين تم تعيينه لاختياري؟

تحرير: الهدف من ذلك هو تمرير سطح مكتب kde الحالي (من dcop kwin KWinInterface currentDesktop) إلى Shell الجديد الذي تم إنشاؤه حتى أتمكن من نقل مواقع nfs إلى My JEdit مثيل على الخادم الأصلي وهو فريد لكل سطح مكتب في كيدي. (باستخدام آلية مثل emacsserver / emacsclient )

السبب في إمكانية مضاعفة مثيلات ssh في وقت واحد هو أنه عندما أقوم بإعداد بيئتي ، فإنني أفتح مجموعة من مثيلات ssh المختلفة على أجهزة مختلفة.

38
Ross Rogers

يمكن استخدام ملف ~/.ssh/environment لتعيين المتغيرات التي تريدها متوفرة للأوامر البعيدة. سيكون عليك تمكين PermitUserEnvironment في تكوين sshd.

يتم تصدير المتغيرات التي تم تعيينها بهذه الطريقة إلى العمليات الفرعية ، بحيث يمكنك:

echo "Foo=Bar" > sshenv
echo "Joe=37" >> sshenv
scp sshenv [email protected]:~/.ssh/environment
ssh [email protected] myscript

وسيعلم myscript أن Foo هو Bar و Joe هو 37.

15
John T

الخيار SendEnv هو رجلك.

~/.ssh/config: (محليًا)

SendEnv MYVAR

/etc/ssh/sshd_config: (في الطرف البعيد)

AcceptEnv MYVAR

الآن ، بغض النظر عن قيمة $MYVAR محليًا ، تصبح متوفرة في جلسة العمل البعيدة أيضًا.
إذا قمت بتسجيل الدخول عدة مرات ، فستحصل كل جلسة على نسختها الخاصة من $MYVAR ، وربما تحتوي على قيم مختلفة.

المقصود ~/.ssh/environment لأغراض أخرى. إنه نوع من الأعمال كملف $ENV عند تنفيذ أوامر غير Shell عن بعد.

50
user15617

هناك أيضا اختراق فظيع رهيب.

إذا كان النص البرمجي يستهلك المتغير في الطرف البعيد (أي يمكنك تسميته ما تريد) ، يمكنك إساءة استخدام متغيرات الإعدادات المحلية. سيتم تمرير أي متغير في النموذج LC_ * حرفيًا ، دون الحاجة إلى التكوين على الإطلاق.

على سبيل المثال ، لدينا سلسلة من خوادم bastion في أحد عملائي. أكره الاضطرار إلى الاتصال به ، فقط للاتصال بخادم آخر ... وخادم آخر ... في كل مرة. لديّ برنامج نصي يتصرف تمامًا مثل SSH ، إلا أنه ذكي.

بشكل أساسي ، إذا تم تعيين LC_BOUNCE_HOSTS ، فسيتم تقسيمها على مسافات وتقشر خارج المضيف الأول. ثم يرتد ويدير البرنامج النصي نفسه. على العقدة الوجهة ، هذه القائمة هي في نهاية المطاف فارغة ، لذلك يتم تشغيل الأمر. لدي أيضًا وضع تصحيح الأخطاء (وهو أمر رائع أثناء مشكلات الشبكة) ، والذي تم تعيينه بواسطة LC_BOUNCE_DEBUG. نظرًا لأن ssh يمرر كل هذه الأمور لي بطريقة سحرية ، فلا يتعين علي فعل أي شيء آخر سوى الاعتراف بنهاية قائمة المضيف (الذي أقوم به بخيار -).

أشعر بالتسخ في كل مرة أستخدمها ، لكنها تعمل في كل مكان جربته.

28
Jayson

يمكنك تمرير القيم باستخدام أمر مشابه لما يلي:

ssh [email protected] VAR=value cmd cmdargs

يمكنك اختبار مع:

ssh machine VAR=hello env

على tcsh يبدو أن العمل التالي:

ssh machine "setenv VAR <value>; printenv"
27
Waltor
bla="MyEnvSelection=dcop"
ssh [email protected] "export $bla && ./runProg"

على باش اختبرت مع:

$ echo '#!/bin/sh' > readEnv.sh
$ echo 'echo "MyEnv: "$MyEnvFromSSH' >> readEnv.sh

$ scp readEnv.sh [email protected]:~/
$ bla="MyEnvFromSSH=qwert"
$ ssh [email protected] "export $bla && ./readEnv.sh"
1
Zeh