Vraag Hoe kan ik automatisch van directory veranderen op ssh login?


Ik probeer te krijgen ssh om automatisch naar een bepaalde map te gaan wanneer ik me aanmeld. Ik probeerde dat gedrag aan de gang te krijgen door de volgende richtlijnen te gebruiken ~/.ssh/config:

Host example.net
LocalCommand "cd web"

maar telkens als ik me aanmeld, zie ik het volgende:

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

hoewel er zeker een is web map in mijn thuismap. Zelfs het gebruik van een absoluut pad geeft hetzelfde bericht. Voor de duidelijkheid, als ik typ cd web na het inloggen kom ik in de juiste map.

Wat mis ik hier?

BEWERK:

Verschillende combinaties van aanhalingstekens / absolute paden geven verschillende foutmeldingen:

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

Dit doet me denken dat de aanhalingstekens er niet zouden moeten zijn en dat er een andere fout optreedt.


77
2017-08-05 14:40


oorsprong


LocalCommand wordt uitgevoerd op uw lokale systeem, niet op het externe systeem. - Steve Kehlet
Kijk hier superuser.com/a/124110/47962 - Nakilon


antwoorden:


cd is een ingebouwde shell. LocalCommand wordt uitgevoerd als:

/bin/sh -c <localcommand>

Wat u wilt doen, kan niet echt worden bereikt via SSH; je moet de schaal op een of andere manier aanpassen, bijvoorbeeld via bashrc / bash_profile.


18
2017-08-05 15:52



Jazeker, ik wilde hetzelfde noemen. Je kunt de cd commando binnen ~/.bashrc op de externe server. - vdboor
Dat is vervelend. Zoals ik in een andere opmerking al zei, heeft de server een aantal hostnamen en wilde ik ander gedrag hebben op basis van wat werd gebruikt. Ik denk dat het niet mogelijk is om te bepalen welke van .bashrc werd gebruikt? - Gareth
Het is mogelijk, maar waarschijnlijk niet aan te raden. Zoiets als het vervangen van ssh door een klein shellscript of een alias die de hostnaam als een te exporteren variabele doorgeeft (a la "ssh -t user @ host 'export connhostname = host; bash - login'"). Maar je begint inderdaad in een heel vreemd gebied terecht te komen. Misschien is een betere vraag: WAAROM wil je dit gedrag? - BMDan
Het is niet echt een grote deal om eerlijk te zijn. Ik ben gewoon in de situatie waar het grootste deel van de tijd dat ik op deze server inlog ik rechtstreeks naar een van de twee mappen ga (afhankelijk van welke host ik gebruik) - Gareth


Dit werkt:

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

Om een ​​map aan te maken als deze niet bestaat:

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

Als u niet toevoegt bash tot het einde van het pad, dan verlaat je na de cd comand wordt uitgevoerd. En als u niet toevoegt --login dan jouw ~/.profile is niet afkomstig.


76
2017-12-21 21:29



Dit beëindigt me op de juiste locatie, met een bash-prompt. perfect! - Peter Ehrlich
Dit werkt ook voor mij, maar als ik het met ssh jump-host probeer te gebruiken, werkt het niet. Ik krijg een verbinding gesloten bericht. - Riccardo


  1. Log in op je vakje
  2. Bewerk ~/.bash_profile 
  3. Aan het einde van het bestand toevoegen cd /path/to/your/destination
  4. Bewaar het en verlaat je editor
  5. Uitloggen uit het vak
  6. Log opnieuw in en je moet het inleveren /path/to/your/destination

39
2018-02-27 11:04



Op sommige machines moet u mogelijk bijlagen toevoegen cd /path/to/your/destination naar ~/.bashrc in plaats van naar ~/.bash_profile. Het resultaat zou hetzelfde moeten zijn. - Matthias
Dit werkt perfect dankzij - is het alleen beperkt tot mijn gebruikers-id of beïnvloedt het ook andere gebruikersinlogins? - barry_allen
@BabyGroot als u wijzigt ~/.bash_profile of ~/.bashrc het heeft alleen invloed op de huidige gebruiker. - rubenvarela


Meer robuuste oplossing voor het geval wanneer u standaard .bashrc-bestand moet sshen en negeren. Dit is handig in gevallen waarin een externe serveromgeving meerdere docroots heeft en door meerdere gebruikers wordt gebruikt.

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

Meer gedetailleerd:

  1. Eerste opdracht maakt .bashrc_tmp bestand in /tmp map op de externe server met een inhoud cd /path/to/dir
  2. Volgende opdracht wordt uitgevoerd bash met config-bestand gespecificeerd in stap 1. Hiermee kan worden omgeschakeld naar gewenste dir en standaard onderdrukken .bashrc.
  3. Dit hele commando is ingepakt als een alias, dus op de opdrachtprompt van de ssh-client kan deze worden opgeroepen als ssh_myserver

5
2017-08-21 11:53



Creatief ... zolang je schrijfpermen hebt voor / tmp - smci


Heb je deze richtlijn ingeschakeld in je ssh-configuratie?

PermitLocalCommand yes

De standaard daarvoor is no, in welk geval jouw LocalCommand richtlijn zou worden genegeerd.

Als alternatief, heb je geprobeerd het commando aan je toe te voegen .bashrc het dossier?


4
2017-08-05 14:47



Die richtlijn is ingesteld, ja (en ik neem aan dat ik het foutbericht niet zou zien als het dat niet was). Het probleem met het gebruik van .bashrc is dat de server verschillende hostnamen heeft, en ik zou graag zien dat verschillende hostnamen naar verschillende startmappen vertalen - Gareth
Tenzij elke hostnaam een ​​ander IP-adres heeft, kan de server niet weten welke hostnaam u hebt aangevraagd. Hoewel HTTP-verzoeken een vriendelijke host: header bieden om de aangevraagde hostnaam te identificeren, doen SSH-verbindingen dat niet. - Fosco


Ik heb dus veel websites doorzocht (stackoverflow, deze) maar ik heb niet gevonden wat ik wilde. Uiteindelijk heb ik mijn eigen shellscript gemaakt. Ik plak het hier. Je kunt ook een map kopiëren in de $ PATH.

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

Dus na dit. Ik doe:

connect <foldername>

Opmerking: mogelijk moet u uitloggen en opnieuw inloggen na het wijzigen van de padvariabele


4
2017-11-25 03:10



Ik geef de voorkeur aan de vorige suggestie omdat '$ SHELL' altijd geldig is, terwijl 'bash' dat misschien niet is. Ook het gebruik van 'exec' is een leuke touch. - Dave
Een verdere verfijning zou zijn om ervoor te zorgen dat 'cd' succesvol is - "cd ~ / $ 1 && exec ..." - Dave


In uw ~/.ssh/config:

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

Aan het einde van uw ~/.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

Ik probeerde dit met behulp van variabele passing, inclusief met een geëxporteerde variabele, maar deze opdrachten worden in verschillende shells uitgevoerd.

Bij het testen van wat je probeerde te doen, kreeg ik trouwens geen fout toen ik het niet-geciteerde absolute pad gebruikte. ik voegde toe ; pwd aan het einde van de opdracht en de juiste map wordt weergegeven, maar de map waarin ik terechtkom is ~. Er zijn geen cd commando's in mijn shell opstartbestanden. Ik heb geprobeerd een ander te plaatsen cd somedir; pwdin ~/.ssh/rc (met de andere nog op zijn plaats). De config commando wordt uitgevoerd voordat motd wordt uitgegeven en de rc commando wordt achteraf uitgegeven, maar voordat de shell-opstartbestanden worden aangekocht. Dus nogmaals, het gebeurt in een andere schaal.

Probeer de pass-by-bestand-techniek en laat me weten of dit voor u werkt.


3
2017-08-05 18:21





Heb je het geprobeerd zonder de aanhalingstekens eromheen? De enige voorbeelden die ik heb gezien, hebben ze niet, dus zou het kunnen zijn om cd \ web als een commando uit te voeren.


2
2017-08-05 15:03



Ok, het verwijderen van citaten lijkt te helpen, maar ik heb nog steeds fouten (zie bewerkt bericht) - Gareth


Je kunt dit ook proberen, met de optie -t:

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

0
2017-09-21 09:03