سؤال كيف يمكنني تغيير الدليل تلقائيًا على تسجيل الدخول إلى ssh؟


أحاول أن أحصل ssh لتغيير تلقائيًا إلى دليل معين عند تسجيل الدخول. حاولت الحصول على هذا السلوك باستخدام التوجيهات التالية في ~/.ssh/config:

Host example.net
LocalCommand "cd web"

ولكن عندما أسجل الدخول ، أرى ما يلي:

/bin/bash: cd web: No such file or directory

على الرغم من وجود بالتأكيد web مجلد في بيتي الدليل. حتى باستخدام مسار مطلق يعطي نفس الرسالة. ليكون واضحا ، إذا كنت اكتب cd web بعد تسجيل الدخول إلى المجلد الصحيح.

ما أنا مفقود هنا؟

تصحيح:

توليفات مختلفة من علامات الاقتباس / المسارات المطلقة تعطي رسائل خطأ مختلفة:

LocalCommand "cd web"
/bin/bash: cd web: No such file or directory

LocalCommand cd web
/bin/bash: line 0: cd: web: No such file or directory

LocalCommand cd /home/gareth/web
/bin/bash: line 0: cd: /home/gareth/web: Input/output error

هذا يجعلني أعتقد أن الاقتباسات يجب ألا تكون هناك ، وأن هناك خطأ آخر يحدث.


79
2017-08-05 14:40


الأصل


يتم تشغيل LocalCommand على النظام المحلي ، وليس النظام البعيد. - Steve Kehlet
انظر هنا superuser.com/a/124110/47962 - Nakilon


الأجوبة:


القرص المضغوط هو قذيفة مدمجة. يتم تنفيذ LocalCommand على النحو التالي:

/bin/sh -c <localcommand>

ما لا تريد فعله هو تحقيقه عبر SSH ؛ تحتاج إلى تعديل shell بطريقة ما ، على سبيل المثال ، عبر bashrc / bash_profile.


19
2017-08-05 15:52



نعم ، أردت فقط أن أذكر لنفسه. يمكنك وضع cd الأمر في ~/.bashrc على الخادم البعيد بدلا من ذلك. - vdboor
هذا مزعج كما ذكرت في تعليق آخر ، يحتوي الخادم على عدد من أسماء المضيفين وأردت أن يكون هناك سلوك مختلف بناءً على أيهما كان مستخدمًا. أعتقد أنه من غير الممكن تحديد أيهما تم استخدامه من .bashrc؟ - Gareth
من الممكن ، ربما ليس من المستحسن. شيء ما مثل استبدال ssh بشفرة نصية صغيرة أو اسم مستعار يمرر اسم المضيف كمتغير ليتم تصديره (a la "ssh -t user @ host" export connhostname = host؛ bash --login '"). لكنك بدأت في الدخول إلى منطقة غريبة للغاية ، في الواقع. ربما كان السؤال الأفضل ، لماذا تريد هذا السلوك؟ - BMDan
انها ليست حقا صفقة كبيرة لتكون صادقة. أنا فقط في الموقف حيث الغالبية العظمى من الوقت سجل الدخول إلى هذا الخادم أتوجه مباشرة إلى أحد دليلين (اعتمادا على المضيف الذي أستخدمه) - Gareth


هذا يعمل:

ssh server -t "cd /my/remote/directory; bash --login"

لإنشاء دليل إذا لم يكن موجودًا:

ssh server -t "mkdir -p newfolder; cd ~/newfolder; pwd; bash --login"

إذا كنت لا تضيف bash إلى نهاية المسار ثم الخروج بعد cd يدير كوماند. وإذا لم تقم بإضافة --login ثم الخاص بك ~/.profile ليس مصدرها.


76
2017-12-21 21:29



هذا ينتهي بي في الموقع الصحيح ، مع مطالبة باش. في احسن الاحوال! - Peter Ehrlich
هذا يعمل بالنسبة لي أيضا ولكن إذا حاولت استخدامه مع ssh jump-host فإنه لا يعمل. أحصل على رسالة مغلقة. - Riccardo


  1. تسجيل الدخول إلى المربع الخاص بك
  2. تصحيح ~/.bash_profile 
  3. في نهاية الملف إضافة cd /path/to/your/destination
  4. احفظه واخرج من المحرر الخاص بك
  5. الخروج من المربع
  6. تسجيل الدخول مرة أخرى ويجب عليك وضعها في /path/to/your/destination

40
2018-02-27 11:04



على بعض الأجهزة قد تحتاج إلى إلحاق cd /path/to/your/destination إلى ~/.bashrc بدلا من أن ~/.bash_profile. يجب أن تكون النتيجة هي نفسها. - Matthias
يعمل هذا بشكل مثالي - هل يقتصر فقط على معرف المستخدم الخاص بي أم أنه يؤثر على تسجيلات دخول المستخدمين الآخرين؟ - barry_allen
BabyGroot إذا عدلت ~/.bash_profile أو ~/.bashrc سيؤثر فقط على المستخدم الحالي. - rubenvarela


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

alias ssh_myserver='ssh server_name -t "echo cd /path/to/desired/dir>/tmp/.bashrc_tmp; bash --rcfile /tmp/.bashrc_tmp"'

أكثر تفصيلا:

  1. يخلق الأمر الأول .bashrc_tmp إملأ /tmp دليل على الخادم البعيد مع المحتوى cd /path/to/dir
  2. ينفذ الأمر التالي bash مع ملف التكوين المحدد في الخطوة 1. وهذا يسمح للتبديل إلى دير المطلوب وقمع الافتراضي .bashrc.
  3. يتم التفاف هذا الأمر ككل alias، لذلك على أمر القيادة العميل سه يمكن أن يطلق عليه باسم ssh_myserver

5
2017-08-21 11:53



مبدع ... طالما لديك إذن الكتابة إلى / tmp - smci


هل قمت بتمكين هذا التوجيه في تهيئة ssh الخاصة بك؟

PermitLocalCommand yes

الافتراضي لذلك هو noفي هذه الحالة LocalCommand سيتم تجاهل التوجيه.

بدلا من ذلك ، هل حاولت إضافة الأمر إلى حسابك .bashrc ملف؟


4
2017-08-05 14:47



تم تعيين هذا التوجيه ، نعم (وأفترض أنني لن أرى رسالة الخطأ التي تظهر إذا لم تكن). المشكلة في استخدام .bashrc هي أن الخادم يحتوي على أسماء مضيف مختلفة ، وأرغب أن تترجم أسماء المضيفات المختلفة إلى دلائل بدء مختلفة - Gareth
ما لم يكن لكل اسم مضيف عنوان IP مختلف ، لن يكون هناك أي طريقة للخادم لمعرفة اسم المضيف الذي طلبته. بينما توفر طلبات HTTP مضيفًا ودودًا: الرأس لتحديد اسم المضيف المطلوب ، فإن اتصالات SSH لا تفعل ذلك. - Fosco


لذلك فقد بحثت في الكثير من المواقع (stackoverflow ، هذا واحد) ولكن لم أجد ما أردت. انتهى بي الأمر إنشاء برنامج نصي شل الخاصة بي. أنا ألصقها هنا. كما يمكنك نسخ دليل في PATH $.

#!/bin/bash
ssh -t <username@hostname> "cd ~/$1; exec \$SHELL --login"

بعد ذلك. أنا افعل:

connect <foldername>

ملاحظة: قد تحتاج إلى تسجيل الخروج وتسجيل الدخول مرة أخرى بعد تغيير متغير المسار


4
2017-11-25 03:10



أفضل هذا الاقتراح السابق لأن "$ SHELL" دائمًا صالح ، بينما "bash" قد لا يكون كذلك. أيضا استخدام "exec" هو لمسة لطيفة. - Dave
ومن شأن التحسين الإضافي أن يضمن أن يكون "cd" ناجحًا - "cd ~ / $ 1 && exec ..." - Dave


في الخاص بك ~/.ssh/config:

LocalCommand echo '/home/%r/some/subdir' > /home/%r/.ssh/ssh_cd

في نهاية الخاص بك ~/.bashrc:

if [[ -f $HOME/.ssh/ssh_cd ]]
then
    cd $(<$HOME/.ssh/ssh_cd)
    # uncomment the line below and the file will be removed so the cd won't work
    # unless the file is regenerated since you may not want this to operate for
    # non-ssh logins or for ssh logins that you want to function differently
    # rm $HOME/.ssh/ssh_cd
fi

حاولت القيام بذلك باستخدام تمرير متغير ، بما في ذلك مع متغير تم تصديره ، ولكن يتم تشغيل هذه الأوامر في قذائف مختلفة.

عند اختبار ما كنت تحاول القيام به لم أجد خطأ عندما استخدمت المسار المطلق غير المقبول ، بالمناسبة. أضفت ; pwd في نهاية الأمر ويتم عرض الدليل الصحيح ، ومع ذلك الدليل الأول في نهاية المطاف هو ~. لا يوجد cd الأوامر في ملفات بدء التشغيل shell. حاولت وضع مختلفة cd somedir; pwdفي ~/.ssh/rc (مع الآخر لا يزال في مكانه). ال config يتم تنفيذ الأمر قبل إصدار motd و rc يتم إصدار الأمر بعد ذلك ، ولكن قبل أن يتم الحصول على ملفات بدء التشغيل shell. مرة أخرى ، يحدث ذلك في قشرة مختلفة.

جرب تقنية المرور عن طريق ملف واسمحوا لي أن أعرف إذا كان يعمل من أجلك.


3
2017-08-05 18:21





هل جربته بدون الاقتباس من حوله؟ الأمثلة الوحيدة التي رأيتها لا تملكها حتى معهم قد تكون محاولة تنفيذ cd \ web كأمر.


2
2017-08-05 15:03



حسنًا ، يبدو أن إزالة علامات الاقتباس مفيدة ولكن لا يزال لديّ أخطاء (انظر مشاركة تم تحريرها) - Gareth


يمكنك أيضًا تجربة هذا ، مع وجود الخيار -t:

ssh server -t "cd /my/remote/directory; bash"

0
2017-09-21 09:03