كيف يمكنني تمرير قيمة إلى أمر ssh ، بحيث تبدأ البيئة التي يتم تشغيلها على الجهاز المضيف مع متغير بيئة معين تم تعيينه لاختياري؟
تحرير: الهدف من ذلك هو تمرير سطح مكتب kde الحالي (من dcop kwin KWinInterface currentDesktop) إلى Shell الجديد الذي تم إنشاؤه حتى أتمكن من نقل مواقع nfs إلى My JEdit مثيل على الخادم الأصلي وهو فريد لكل سطح مكتب في كيدي. (باستخدام آلية مثل emacsserver / emacsclient )
السبب في إمكانية مضاعفة مثيلات ssh في وقت واحد هو أنه عندما أقوم بإعداد بيئتي ، فإنني أفتح مجموعة من مثيلات ssh المختلفة على أجهزة مختلفة.
يمكن استخدام ملف ~/.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.
الخيار SendEnv
هو رجلك.
~/.ssh/config: (محليًا)
SendEnv MYVAR
/etc/ssh/sshd_config: (في الطرف البعيد)
AcceptEnv MYVAR
الآن ، بغض النظر عن قيمة $MYVAR
محليًا ، تصبح متوفرة في جلسة العمل البعيدة أيضًا.
إذا قمت بتسجيل الدخول عدة مرات ، فستحصل كل جلسة على نسختها الخاصة من $MYVAR
، وربما تحتوي على قيم مختلفة.
المقصود ~/.ssh/environment
لأغراض أخرى. إنه نوع من الأعمال كملف $ENV
عند تنفيذ أوامر غير Shell عن بعد.
هناك أيضا اختراق فظيع رهيب.
إذا كان النص البرمجي يستهلك المتغير في الطرف البعيد (أي يمكنك تسميته ما تريد) ، يمكنك إساءة استخدام متغيرات الإعدادات المحلية. سيتم تمرير أي متغير في النموذج LC_ * حرفيًا ، دون الحاجة إلى التكوين على الإطلاق.
على سبيل المثال ، لدينا سلسلة من خوادم bastion في أحد عملائي. أكره الاضطرار إلى الاتصال به ، فقط للاتصال بخادم آخر ... وخادم آخر ... في كل مرة. لديّ برنامج نصي يتصرف تمامًا مثل SSH ، إلا أنه ذكي.
بشكل أساسي ، إذا تم تعيين LC_BOUNCE_HOSTS ، فسيتم تقسيمها على مسافات وتقشر خارج المضيف الأول. ثم يرتد ويدير البرنامج النصي نفسه. على العقدة الوجهة ، هذه القائمة هي في نهاية المطاف فارغة ، لذلك يتم تشغيل الأمر. لدي أيضًا وضع تصحيح الأخطاء (وهو أمر رائع أثناء مشكلات الشبكة) ، والذي تم تعيينه بواسطة LC_BOUNCE_DEBUG. نظرًا لأن ssh يمرر كل هذه الأمور لي بطريقة سحرية ، فلا يتعين علي فعل أي شيء آخر سوى الاعتراف بنهاية قائمة المضيف (الذي أقوم به بخيار -).
أشعر بالتسخ في كل مرة أستخدمها ، لكنها تعمل في كل مكان جربته.
يمكنك تمرير القيم باستخدام أمر مشابه لما يلي:
ssh [email protected] VAR=value cmd cmdargs
يمكنك اختبار مع:
ssh machine VAR=hello env
على tcsh يبدو أن العمل التالي:
ssh machine "setenv VAR <value>; printenv"
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"