Eu tenho o servidor Windows OpenSSH instalado e funcionando corretamente. Eu posso alterar o shell padrão que é ssh'd para usar HKLM:\SOFTWARE\OpenSSH
e adicionar uma DefaultShell
propriedade conforme descrito aqui .
Então vamos ao exemplo padrão, já que ele funciona como está em praticamente todas as instalações do Windows com o C:\Windows
caminho "normal":
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force
Agora digamos que eu queira adicionar um parâmetro a ele, talvez "-NoLogo". Este é apenas um exemplo. Em última análise, eu gostaria de poder lançar em uma distribuição WSL com opções. Mas, por enquanto, vamos simples:
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoLogo" -PropertyType String -Force
Isso não apenas não funciona, como também interrompe o login de maneiras estranhas. Com o primeiro método (sem argumentos), minha chave pública no ssh-agent é oferecida e aceita. Quando adiciono o -NoLogo
, acabo em um prompt de senha, que falha ao usar minha senha do Windows.
Espetáculos de corrida sshd.exe -ddd
:
User not allowed because shell c:\\windows\\system32\\windowspowershell\\v1.0\\powershell.exe -nologo does not exist
Ok, então isso não vai funcionar, porque o OpenSSH verifica se a DefaultShell
string exata é um executável.
Vejo que existem duas outras configurações de registro, mas nenhuma parece ser o que estou procurando . Pode-se pensar em seu nome que DefaultShellCommandOption
seria útil aqui, mas é simplesmente a opção necessária para o shell quando um comando é passado, como:
ssh hostname ls
Como uma das tentativas de resposta aqui pensei DefaultShellCommandOption
que faria o truque, eu tentei e confirmei que ela só é usada quando um comando é passado. Também posso ver na fonte OpenSSH que shell_option é usado apenas quando há um comando , caso contrário, ele só executa o shell sozinho:
if (command) {
size_t len = strlen(shell) + 1 + strlen(shell_option) + 1 + strlen(command) + 1;
pty_cmd = calloc(1, len);
strcpy_s(pty_cmd, len, shell);
strcat_s(pty_cmd, len, " ");
strcat_s(pty_cmd, len, shell_option);
strcat_s(pty_cmd, len, " ");
strcat_s(pty_cmd, len, command);
} else {
pty_cmd = shell;
}
Alguém está ciente de uma maneira de adicionar parâmetros/argumentos ao DefaultShell
Windows OpenSSH?
Solução alternativa potencial
Depois que percebi que o OpenSSH estava verificando se
DefaultShell
existia e era executável, decidi apenas tentar criar um arquivo em lote envolvendo as opções do PowerShell.Criei um diretório e um arquivo
C:\ProgramData\OpenSSH\ssh-shell.bat
:E mudei meu
DefaultShell
para executar esse wrapper (de um PowerShell elevado):Isso parece funcionar como desejado, tanto para acesso ao próprio shell quanto ao executar com um comando (por exemplo
ssh hostname ls
, ).Também é possível iniciar diretamente em uma distribuição WSL especificada desta forma:
Observe que isso requer que o
DefaultShellCommandOption
também seja alterado:Implicações de segurança
Parece que é tão seguro quanto o
DefaultShell
comportamento padrão do OpenSSH, pois ele cria a linha de comando usando o shell real (mais meus argumentos adicionais desejados), oDefaultShellCommandOption
(-c
por padrão) e os comandos que são passados.Mas estou aberto a sugestões sobre como isso pode ser mais robusto ou seguro, ou se há algum problema de segurança que alguém possa ver.