Este é um tipo de pergunta de acompanhamento para esta pergunta: ssh, inicie um shell específico e execute um comando na máquina remota? , exceto mais especificamente em relação a ash
, e focado no fato de que fornecer um arquivo .bashrc como parte de iniciar o shell na sessão ssh não funciona para mim.
Estou em um dispositivo Linux embutido que tem uma versão busybox de sh
e ash
, mas não há bash
. Compartilhamos um nome de usuário comum ( root
) e um ambiente de execução comum.
No entanto, gostaria de ter alguns aliases personalizados e uma PS1
variável Prompt String 1 personalizada.
Aqui está um exemplo de sessão ssh normal. Observe que estou usando sshpass
para passar minha senha para ssh
, com minha senha armazenada no ~/pw
arquivo.
Você pode ver que o shell padrão é -sh
e não há aliases. A string de prompt padrão PS1
também não mostra nenhum caminho.
$ sshpass -f ~/pw ssh [email protected] [root@device]$ echo $0 -sh [root@device]$ alias [root@device]$
O dispositivo não tem bash
, mas tem ash
, o que aparentemente é semelhante ao bash. Então, eu quero fazer disso meu shell enquanto eu ssh. Eu também quero copiar o ~/.bashrc
arquivo padrão do Ubuntu, localizado na /etc/skel/.bashrc
máquina Ubuntu de onde estou ssh-ing , para o dispositivo em /tmp/.bashrc
para que eu possa originá-lo, e eu quero meu comando ssh para fazer isso. Não consigo copiar ~/.bashrc
no dispositivo remoto porque o diretório inicial é somente leitura.
Eu tentei o seguinte, mas recebo o seguinte erro:
cmd:
sshpass -f ~/pw scp /etc/skel/.bashrc [email protected]:/tmp/.bashrc \
&& sshpass -f ~/pw ssh -t [email protected] '. /tmp/.bashrc'
resultado:
Connection to 192.168.0.2 closed.
Nenhuma sessão ssh foi estabelecida.
Tentei então o seguinte comando, com o seguinte resultado, mostrando que o sourcing não funcionou, embora o ash
shell tenha sido inserido.
$ sshpass -f ~/pw scp /etc/skel/.bashrc [email protected]:/tmp/.bashrc \ && sshpass -f ~/pw ssh -t [email protected] '. /tmp/.bashrc; ash' ~ # echo $0 ash ~ # alias ~ #
Eu posso executar . /tmp/.bashrc
manualmente agora, porém, e funciona bem. Observe como após o sourcing, que funciona, tenho uma string de prompt aprimorada e novos aliases:
~ # . /tmp/.bashrc ash: /tmp/.bashrc: line 16: shopt: not found ash: /tmp/.bashrc: line 24: shopt: not found ash: /tmp/.bashrc: line 111: shopt: not found root@device:~# alias l='ls -CF' alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '"'"'s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'"'"')"' la='ls -A' ll='ls -alF'
Você também vê os erros de cinzas da linha 16, 24 e 111 por shopt
não serem encontrados. Mesmo se eu comentar isso no arquivo .bashrc que envio, os resultados mostrados acima ainda são os mesmos.
Como posso fazer meu comando acima funcionar? Eu gostaria que ele entrasse no ssh, defina o shell para algo mais parecido com o bash e originasse meu /tmp/.bashrc
arquivo que eu fiz o scp.
Em um dispositivo incorporado semelhante que foi instalado bash
, este cmd funciona perfeitamente, conforme documento em meu repositório aqui :
sshpass -f ~/pw scp /etc/skel/.bashrc [email protected]:/tmp \
&& sshpass -f ~/pw ssh -t [email protected] 'bash --rcfile /tmp/.bashrc'
Para bash
, usar bash --rcfile /tmp/.bashrc
no final do cmd ssh é o que eu preciso. Mas, para o dispositivo sem bash
, preciso de ajuda para obter esse comportamento com ash
ou semelhante.
Por que você está correndo
ash
? É improvável que um sistema com busybox tenha dois shells diferentes. (É tecnicamente possível que/bin/sh
não seja o mesmo shell que/bin/ash
, mas seria uma configuração muito improvável em um dispositivo incorporado.)Além de alguns aliases ou funções simples, muito pouco do conteúdo típico de
.bashrc
provavelmente funcionará no ash (ou em qualquer shell que não seja o bash). As coisas que não funcionarão incluemshopt
, atalhos de teclado, configurações de prompt, qualquer função que use extensão não POSIX, qualquer alias que se refira a comandos não presentes no dispositivo incorporado.Você está lendo
/tmp/.bashrc
no shell original e, em seguida, executando um programa de shell diferente. Esse programa diferente não herda nenhuma das configurações internas do shell, como aliases. É um problema completamente diferente do ssh, iniciar um shell específico e executar um comando na máquina remota? que é sobre leitura.profile
, que define variáveis de ambiente, que são herdadas.O ash do BusyBox lê comandos do arquivo cujo nome está
$ENV
quando ele inicia interativamente. (O sh do BusyBox pode ser ash ou hush; já que você tem umash
comando, o seu é ash.) Assim, você pode definirENV
o nome do arquivo onde deseja ler os comandos.Seu shell padrão é armazenado no
/etc/passwd
arquivo. Qualquer usuário pode alterar seu shell padrão com ochsh
comando. Os shells autorizados estão listados em/etc/shells
. Claro, o bash deve estar presente antes de mudar para este shell.