ssh 세션 dynamicaly에 로컬 쉘 별명로드


24

내가 사용하는 일부 컴퓨터에 로그인 할 때 SSH를 내 소원 별칭기능 이이다. 즉, 명령 바로 가기를 사용할 수 있기를 원하는 일부 컴퓨터에 로그인하십시오.

로그인 할 때마다 별칭이 업데이트되기를 원합니다.

참고 : 시스템과 파일을 모르고 처음 로그인하는 경우가 종종 있습니다. 때때로 단일 로그인입니다. 해당 시스템에 대해 한 번만 수행하십시오. 나중에 정리해야하며 이전 구성도 복원해야합니다.

답변:


18

.bashrc다른 이름으로 원격 컴퓨터에 임시로 복사 할 수 있습니다 . 예를 들어, 사용 .bashrc_temp:

user@local$ scp .bashrc user@remote:~/.bashrc_temp

그런 다음 원격 시스템에 로그인 할 수 있습니다.

user@local$ ssh user@remote

그리고 source파일 .bashrc_temp:

user@remote$ source ~/.bashrc_temp

이제 당신 .bashrc과 당신의 기능 을 사용할 수 있습니다. 작업이 끝나면 원격 시스템에서 ~ / .bashrc_temp 파일을 제거하고 로그 아웃 할 수 있습니다.

파일 복사 및 원격 시스템으로의 로그인은 bash 기능을 사용하여 수행 할 수 있습니다.

# copy the .bashrc to the remote machine 
# and log into the remote machine.
# parameter $1: user@remote
function s() {
  scp ~/.bashrc $1:~/.bashrc_temp
  ssh $1
}

업데이트 :

당신은 또한을 복사 고려할 수 .bashrc/tmp원격 기계와 소스 /tmp/.bashrc_temp.

업데이트 2 :

ssh -t 를 사용하여 원격 시스템에 로그인 할 수 있습니다 . 이것은 자동으로 온도를 사용합니다 .bashrc. 업데이트 된 기능 s():

function s() {
  scp ~/.bashrc $1:/tmp/.bashrc_temp
  ssh -t $1 "bash --rcfile /tmp/.bashrc_temp ; rm /tmp/.bashrc_temp"
}

이것은 내가 찾고있는 것입니다. 감사! 그러나 더 기능적으로 할 수 있습니까? 한 단계에서? 이제 로그인, 소스, 로그 아웃 전에 삭제의 3 단계가 필요합니다.

확인 후 업데이트가 표시됩니다. 큰. 한 번 더 수정 : "bash는 --rcfile /tmp/.bashrc_temp, RM은 /tmp/.bashrc_temp"

업데이트 2에 수정 사항을 추가했습니다. 감사합니다.

5
거의 모든 답변 (이 답변 포함)은에서 예측 가능한 파일 이름을 사용 /tmp/합니다. 이것은 다른 사용자에 의해 사 용되어 로그인하는 사용자로 코드를 실행할 수 있습니다. mktemp임시 파일의 이름이 고유해야합니다.
Tometzky

9

jens-na는 훌륭한 답변을 제공했습니다. 나는 약간의 시간을 보냈고 조금 더 잘 일하기 위해 약간 재 작업했습니다. 이 방법으로 포트 번호와 같은 모든 매개 변수를 SSH로 전달할 수 있습니다. 차이점은 다른 명령 매개 변수 이름을 사용하는 대신 ssh명령을 사용하여 .bashrc파일 을 업로드 한다는 점 scp입니다.

또한 파일이 다른 파일을 업로드 .bashrc_remote하므로 모든 것 대신 원격 서버에서 원하는 것을 정확하게 선택할 수 있습니다.

sshs() {
        ssh $@ "cat > /tmp/.bashrc_temp" < ~/.bashrc_remote
        ssh -t $@ "bash --rcfile /tmp/.bashrc_temp ; rm /tmp/.bashrc_temp"
}

다음과 같이 실행하십시오.

sshs user@server

' sshs' 이름 은 "SSH 소스"입니다. ssh소싱하고 싶지 않을 때 사용하고 할 때 사용하십시오 sshs.

https://gist.github.com/jonahbron/5549848


유용합니다. 동일한 매개 변수 집합은 다른 포트 번호를 지정하기 위해 ~ / .ssh / config에 항목을 추가 할 필요가 없습니다!
Tomek Wyderka 12

동일한 명령 이름이므로 한 번의 실행으로 암호를 한 번만 입력하고 암호를 한 번만 입력 할 수 있습니다. 불행히도 명령을 하나의 보고서에 결합하는 방법 :Pseudo-terminal will not be allocated because stdin is not a terminal
Tomek Wyderka

@TomekWyderka 그래, 약 20 분 동안 한 명령으로 끝내려고했지만 길을 찾지 못했습니다. 아마도 내가 알아낼 수있는 것보다 BASH에 정통한 사람 일 수도 있지만 가능하지 않은 것으로 보입니다.
요나

2
나는이 답변을 가져 와서 몇 주에 걸쳐 반복했습니다. 결과는 문제를 분쇄 전체 날려 도구입니다 github.com/Russell91/sshrc
RussellStewart

1
@Jonah 왜 $ @ 대신 $ {* : 1}을 사용했는지 설명해 주실 수 있습니까?
RussellStewart

8

나는 sshrc가 당신이 찾고있는 것이라고 생각합니다 : https://github.com/Russell91/sshrc

sshrc는 ssh처럼 작동하지만 원격으로 로그인 한 후 ~ / .sshrc도 제공합니다.

$ echo "echo welcome" > ~/.sshrc
$ sshrc me@myserver
welcome

$ echo "alias ..='cd ..'" > ~/.sshrc
$ sshrc me@myserver
$ type ..
.. is aliased to `cd ..'

이를 사용하여 환경 변수를 설정하고 기능을 정의하며 로그인 후 명령을 실행할 수 있습니다. 그것은 sshrc를 사용하더라도 서버의 다른 사용자에게는 영향을 미치지 않습니다. 보다 고급 구성을 보려면 계속 읽으십시오.


좋은. 나는 xxd 핵을 좋아한다!
Tomek Wyderka

@Tomek-네 xxd 핵은 완전히 굉장합니다. 나는 scp로 일을 끝내려고 정말로 노력했다. 그런 다음 ssh로 배관합니다. 서버에 대한 두 번의 호출-두 개의 비밀번호 입력-두 번의 왕복 여행 없이는 수행 할 수 없습니다. 용납 할 수 없었습니다. 그래서 나는 생각할 수 없었습니다.
RussellStewart

버그가 있습니다. 응답없이 sshrc가 정지합니다. 디버그 코드 (설명에있을 수 있음)를 sshrc에 넣을 수 있으므로 추적 할 수 있습니다.
Tomek Wyderka

흥미 롭군 이것은 단지 bash 스크립트이므로 일반적으로 발생하는 모든 오류 또는 경고가 화면에 자동으로 인쇄됩니다. .sshrc.d에 몇 바이트가 있습니까? 또한 입력 만하면 vim $(which sshrc)bash 파일을 볼 수 있습니다. 각 줄 뒤에 에코 명령을 추가하여 행이 어디에서 있는지 확인할 수 있습니다.
RussellStewart

5

제한 사항을 모르지만 다음과 같은 작업을 수행 할 수있었습니다.

function ssh_with_rc() {
   RC_DATA=`cat ${HOME}/.bashrc | base64 -w 0`
   ssh -t $@ "echo \"${RC_DATA}\" | base64 --decode > /tmp/${USER}_bashrc; bash --rcfile /tmp/${USER}_bashrc; rm /tmp/${USER}_bashrc"
}

alias ssh="ssh_with_rc"

이것은 단일 ssh 명령이기 때문에 scp가 없기 때문에 가장 좋은 대답입니다. 나에게 남아있는 유일한 개선점은 RC_DATA변수 를 피하는 방법을 찾는 것 입니다.
Sridhar Sarnobat

2

이것이 내가 생각해 낸 것입니다. 일반적인 rc 파일을 유지할 수있을뿐 아니라 하나의 ssh 연결에서 모든 작업을 수행 할 수 있습니다 (즉, 먼저 scp를 수행하는 대신 한 번만 로그인하면 됨).

#copies some environment over to the remote machine
function ssh() {
  /usr/bin/ssh -t $* "echo `base64 -i ~/bin/remote_ssh_env.sh` | base64 --decode > /tmp/remote_ssh_env.sh; bash --rcfile /tmp/remote_ssh_env.sh"
}

rc 파일의 크기가 어느 정도인지 확실하지 않습니다.


이 작업을 올바르게 수행하려면 명령의 일부를 작은 따옴표로 묶어야했습니다. echo '`base64 .... sh`'-그 후 아름답게 작동했습니다. 감사!!
K Robinson

크기가 문제가되면 base64 인코딩 전에 gzip과 같은 압축 유틸리티를 통해 파일 내용을 파이프 할 수 있습니다.
K Robinson

2

https://github.com/fsquillace/pearl-ssh 가 필요한 것을 수행한다고 생각 합니다.

sshrc가 태어나 기 전에 오래 전에 작성했으며 sshrc에 비해 더 많은 이점이 있습니다.

  • 두 호스트 모두에 대해 xxd에 대한 종속성이 필요하지 않습니다 (원격 호스트에서 사용할 수 없음).
  • Pearl-ssh는보다 효율적인 인코딩 알고리즘을 사용합니다.
  • ~ 20 줄의 코드입니다 (정말 이해하기 쉽습니다!)

예를 들어 :

$> echo "alias q=exit" > ~/.config/pearl/sshrc
$> ssh_pearl myuser@myserver.com
myserver.com $> q
exit

1

단일 SSH 세션에서 작동하게하는 한 가지 옵션은 변수를 사용하여 bash 파일을 복사하지 않고 저장하는 것입니다.

$ mybash=`cat mybash`
$ ssh -t 127.0.0.1 "echo $mybash > /tmp/mybash; bash --rcfile /tmp/mybash ; rm /tmp/mybash"

나를 위해 일하는 것 같습니다.


1

나는 당신과 같은 문제를 해결하기 위해 찾고 있었고, 실제로 찾고있는 것이 sshfs라는 것을 깨달았습니다. 어쩌면 당신도 그것을 사용할 수 있습니까?

내 문제는 ssh'ing 할 때 원격 작업을하면서 색상, 별칭, 함수 및 스크립트를 유지하고 싶었습니다.

http://fuse.sourceforge.net/sshfs.html


롤, 이것은 나에게도 일어난 적이 없다. 매우 창의적인 솔루션입니다.
Sridhar Sarnobat 's
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.