Eu auto-responderei, pois finalmente descobri o segredo. Nem a opção -t
para a opção ssh
, nem a -l
para bash
levarão ao shell de login por conta própria - mas em combinação elas funcionam.
ssh [email protected] -t 'cd /some/where; FOO=BAR NUMBER=42 bash -l'
altera o diretório, define as variáveis de ambiente e inicia o shell de login apropriado (a única diferença que encontrei até agora é que /etc/motd
não é exibido dessa maneira - normalmente é ssh
's ou login
é responsabilidade, não bash
's - além de que tudo parece funcionar perfeitamente, e todas as variáveis ambientais são idênticas).
Essas alterações de ambiente / diretório acontecem depois do ssh, portanto, elas não são restritas por PermitUserEnvironment
e configurações relacionadas (exatamente como planejado), mas antes de .bashrc
/ .profile
ser executado. Isso tem vantagens e desvantagens - é mais difícil simplesmente sobrescrever algo que é definido a partir de scripts bash como PS1
, mas é mais fácil empacotar exatamente os valores corretos em ssh
, e ter .profile
fazendo todo o trabalho pesado .
E, se for realmente necessário, é realmente fácil fazer algo depois de .profile
com a linha de comando como ssh [email protected] -t 'cd /mnt; echo ". ~/.bash_profile; PS1=\"\h-\w \"" >~/xxx; bash --init-file ~/xxx'
- muito feio quando colocado dessa forma, mas esses arquivos .profile
alternativos podem ser preparados antes.
(até onde eu sei, bash
tem alguns locais candidatos para o script .profile
e executará o primeiro encontrado - . file
não tem esses fallbacks automáticos, então você precisa verificar onde está sua% normalprofile
se você quiser fazer isso)