Eu quero usar um comando sobre ssh:
ssh myuser@myhost mycommand
mas fazendo isso eu sempre recebo:
sh: mycommand: command not found
usando o seguinte obviamente funciona:
ssh myuser@myhost /usr/local/bin/mycommand
e eu entendo o porquê: é porque o comando é de alguma forma executado em um shell sem login.
Usar o comando completo ou qualquer outro parâmetro no meu comando ssh não é uma opção no meu cenário. Meu comando é executado por um script que não posso tocar e funcionou em todos os hosts, exceto este.
O host que está me dando o problema é um Synology NAS e a configuração /etc/passwd para esse myuser é:
myuser:x:1048:100::/var/services/homes/myuser:/bin/sh
Novamente:
Eu posso:
- ssh como myuser em myhost
- execute como myuser usando o caminho absoluto fornecido pelo qual mycommand
- execute mycommand (não absoluto) quando já estiver em myhost (via ssh)
Não posso deixar de querer:
- execute: ssh myuser@myhost mycommand (não absoluto, sem parâmetros adicionais)
Provavelmente, o seu
$PATH
não inclui/usr/local/bin
. Como isso é ssh, existem três abordagens que vêm à mente:Se
PermitUserEnvironment
estiver habilitado na configuração do sshd, você deve poder definiPATH
-~/.ssh/environment
lo (esse é um arquivo em seu diretório inicial no servidor - o NAS).Se você puder editar a configuração do sshd, poderá usar
SetEnv PATH=/bin:/usr/bin:/usr/local/bin
(etc.) para definir um caminho. Pelo menos se estiver usando OpenSSH.É possível que você possa usar a opção do cliente
SetEnv
ssh para enviar ao servidor um PATH, dependendo da configuração do servidor. Você pode definir isso em seu~/.ssh/config
arquivo, em sua máquina cliente.Observe que os arquivos de configuração do servidor OpenSSH e do cliente podem ter opções limitadas a clientes/servidores específicos. Por exemplo, na configuração do cliente, você poderia fazer algo assim:
para fazer isso apenas para um servidor. Observe que o bloco continua até que o próximo bloco comece (por exemplo, outro
Host …
bloco) — o recuo é apenas para clareza visual.Os arquivos de configuração do OpenSSH estão documentados nas páginas
ssh_config
e manual.sshd_config
Ok, então em uma investigação mais aprofundada, notei que em todos os meus outros hosts meu comando está de fato em /usr/bin e não em /usr/local/bin . A razão para isso é que todo gerenciador de pacotes o instalou em /usr/bin, exceto a estranha "loja de software" (ou o que quer que seja chamada) da synology.
Eu segui o caminho "sujo" e acabei de criar um link simbólico: /usr/bin/mycommand > /usr/local/bin/mycommand:
Agora, para todos que enfrentam um problema semelhante: há uma razão pela qual existe um /usr/local/bin e pode haver riscos com minha solução. Mas é o mais fácil e rápido e eu já gastei muito tempo com esse problema. Na minha situação, todas as chaves ssh serão limitadas de qualquer maneira a apenas um comando, então eu realmente não me importo.
De qualquer forma: se você quiser ler mais sobre a diferença entre esses dois locais, recomendo este post: https://askubuntu.com/a/308048