SSH를 통해 원격 컴퓨터에서 스크립트를 실행하려고 합니다. 이를 위해 디렉토리를 변경하고 거기에서 스크립트를 실행하고 싶습니다. 내가 찾은 표준 방법은 다음과 같습니다.
ssh -Y -t user@server 'cd dir; exec bash'
그러나 문제는 스크립트를 실행하기 전에 ~./bashrc에서 수행하는 몇 가지 추가 스크립트를 설정해야 한다는 것입니다. 내 문제는 ~./bashrc가 실행되기 전에 디렉토리 변경이 발생하는 방식으로 명령이 작성된다는 것입니다. 즉, 이전에 설정해야 했던 코드가 엉망이 됩니다. 참고: 명령을 다음으로 변경합니다.
ssh -Y -t user@server 'exec bash; cd dir'
bash는 정상적으로 실행되지만 이후 디렉터리는 변경되지 않습니다. 미리 감사드립니다.
답변1
내 문제는 ~./bashrc가 실행되기 전에 디렉토리 변경이 발생하는 방식으로 명령이 작성된다는 것입니다.
아마도 ~/.bashrc
아무도 그것을 전혀 읽지 않을 것입니다. Bash는 ~/.bashrc
호출될 때만 읽습니다.인터렉티브(비로그인) 쉘. 명령줄에서 실행할 명령을 실행하면 ssh
이 옵션을 사용하여 셸이 실행되어 -c
비대화형이 됩니다.
하지만 수동으로 소싱하여 이 문제를 해결할 수 있습니다 .bashrc
.
ssh -t user@server '. ~/.bashrc; cd dir; exec bash'
일부 bashrc
파일은 셸이 대화형인지 확인하고 그렇다면 변경 사항만 적용합니다. ( bashrc
대화형 쉘에서만 읽을 수 있기 때문에 불필요한 것처럼 들리지만 Bash의 시작 파일이 작동하는 방식으로 인해 bashrc
일반적으로 .bash_profile
또는 동등한 파일에서 파생되기도 합니다.)
이 문제를 해결하려면 다음과 같이 Bash에 대한 대화형 호출을 강제해야 합니다.
ssh -t user@server 'bash -ic "cd /tmp; exec bash"'
.bashrc
-i
이제 Bash가 스스로 할 수 있기 때문에 수동으로 소싱할 필요가 없습니다 . 이것두번째Bash(from exec bash
)도 이 작업을 수행할 수 있으므로 문제가 되는 경우 마지막 부분을 exec bash --norc
.
...
관련 설정을 여러 파일(예: )로 분할하는 것이 좋습니다 .thingy.rc
. 그런 다음 .bashrc
(필요한 경우) 명령을 대신 SSH로 실행합니다 .bashrc
.
답변2
하나는 어때?여기아래와 같이 문서화:
ssh user@server << EOF exec bash
cd dir
EOF