Alterar o diretório inicial com segurança

82

Estou tentando atualizar com segurança o diretório inicial conforme especificado em /etc/passwd, mas os utilitários padrão do Linux - usermod e vipw - para fazer isso não são fornecidos pelo Cygwin.

Alguém poderia me dizer como eles mudaram isso no Cygwin?

sblundy
fonte
4
A pergunta duplicada em stackoverflow.com/q/1494658/923560 fornece respostas para versões recentes do Cygwin começando com 1.7.34.
Abdull,

Respostas:

96

EDITAR: Para versões recentes do Cygwin (1.7.34 e além), consulte esta pergunta mais recente .

Como a resposta de sblundy, você sempre pode editar manualmente.

Mas se você quiser fazer isso da maneira "oficial", use o mkpasswdcomando específico do cygwin . Abaixo está um snippet dos documentos oficiais sobre mkpasswd:

Por exemplo, este comando:

Exemplo 3.11. Usando uma raiz doméstica alternativa

$ mkpasswd -l -p "$(cygpath -H)" > /etc/passwd

colocaria os diretórios pessoais dos usuários locais no diretório 'Perfis' do Windows.

Há vários outros comandos realmente úteis descritos na página de documentação dos utilitários Cygwin (que inclui mkpasswd). O uso de cygpathno exemplo acima é outra dessas ferramentas específicas do cygwin.

Já que você está nisso, provavelmente também deseja ler a documentação Usando o Cygwin de maneira eficaz com o Windows . Há um monte de conselhos realmente bons.

netjeff
fonte
10
Se você estiver em um domínio, pode considerar este comando alternativo: ( -dpara domínio) $ mkpasswd -l -d -p "$(cygpath -H)" > /etc/passwd Isso não funcionou para mim - basicamente travou. Como sou o único usando esta máquina, poderia usar esta alternativa, que deve ser segura quer você esteja ou não em um domínio (o -cé para "usuário atual) $ mkpasswd -l -c -p "$(cygpath -H)" > /etc/passwd
Ryan Pavlik
1
Depois de fazer isso, o .bashrc não parece ser lido, mesmo se eu copiá-lo para o meu novo $HOME. Alguma ideia de como consertar isso?
Jeff
1
A saída deve ser anexada (>>) a / etc / passwd (para cenários corporativos com vários usuários). Isso funcionou! :)
Andre
1
use uname -r para ver em qual versão do cygwin você está
martin jakubik
19

Acabei saindo de todos os meus shells cygwin e editando-os manualmente em um editor de texto. Por enquanto, tudo bem.

Nota: não escape dos espaços no diretório "Documents and Settings". A entrada será semelhante a

user:...:/cygdrive/c/Documents and Settings/user:/bin/bash

A linha é simbolizada no :personagem.

sblundy
fonte
Isso funciona para caminhos UNC também, obrigado substituía a variável HOME antes
HaveAGuess
O que devo editar manualmente? Não sei por que meu diretório inicial do cygwin é /cygdrive/c/Users/JoseAngel/AppData/Roaming/SPB_16.6 Eu quero que seja C: / Usuários / MeuNome /
16

A resposta mais simples que encontrei é fazer com que / home seja um link virtual para o diretório Home / UserProfile do Windows

cd /
mv home oldhome
ln -s "$(cygpath -H)" home

Usei o cygpath, pois ele obterá o local apropriado para o diretório HOME na versão atual do Windows. Na minha caixa cygpath -Hretorna/cygdrive/c/Users

M Smith
fonte
Depois de fazer isso por algum tempo, há uma desvantagem: tenho que executá-lo toda vez que atualizo o cygwin usando o setup.exe. Não é grande coisa, mas algo para lembrar.
M Smith
Esta é a melhor resposta. Eu me pergunto por que o cygwin não faz o padrão cygwin -Hpor padrão. É o local mais adequado e, como o Windows 7 também não tem espaço no seu caminho.
dashesy
em outra nota, isso não funcionará. De repente, ele decidiu ignorar o link simbólico!
precipitado
Você deve reaplicá-lo quando executar a instalação novamente. Essa é a única vez que falhou para mim. Ainda não experimentei no Windows 10
M Smith
Funciona como esperado no Windows 10. Ainda tenho que reaplicar cada vez que atualizo o cygwin.
M Smith
8

Para o usuário atual, o seguinte funcionou para mim:

  1. Feche o Cygwin.
  2. Defina a variável de ambiente do usuário HOME do Windows.
  3. Inicie o Cygwin.
  4. execute "mkpasswd -c -p" $ (cygpath -H) "> / etc / passwd".
  5. Reinicie o Cygwin.

Eu confirmei que funcionou executando ssh-keygen sem nenhum argumento. Depois de fazer essa alteração, o aplicativo agora padroniza para salvar a chave em / cygdrive / c / Users / user em vez de / home / user.

Não sei se a configuração de HOME é necessária, mas fiz de qualquer maneira seguindo as instruções para configurar o TortoiseGit com o Cygwin usando a documentação oficial do Tortoise para suporte não oficial do Cygwin aqui . Configurar HOME sozinho, entretanto, não foi suficiente para o ssh-keygen reconhecer a mudança no diretório home.

Além disso, observe que a documentação oficial do Cygwin sobre este problema pode ser encontrada aqui .

Confirmado no Windows 7 usando Cygwin v1.7.35 de 64 bits.

Samuel
fonte
Para Cygwin 1.7.35+, o uso de mkpasswd é desencorajado em favor de /etc/nsswitch.conf
Christopher
4

Sempre defino HOME como uma variável de ambiente específica do usuário em Propriedades do computador.

JesperE
fonte
Estou tentando evitar isso, pois ele está configurado para uma unidade de rede corporativa. Parece que funcionaria.
sblundy
6
Observe que isso não funcionará com ssh, ele ignora explicitamente o HOME e sempre usa / etc / passwd. Veja a última frase de cygwin.com/faq/faq-nochunks.html#faq.setup.home .
Studgeek
3

Para evitar problemas causados por ter espaços no caminho para seu diretório home, use o curto-forma de diretório 'Profiles' do Windows - ou seja /cygdrive/c/DOCUME~1/user.

Você pode fazer isso digitando o comando:

mkpasswd -l -p "$(cygpath $(cygpath -dH))" > /etc/passwd
Steven Penny
fonte
2

Gosto de manter minha instalação do cygwin sincronizada com um pen drive e outro computador, então odeio embutir o diretório inicial. Eu uso o seguinte cygwin.bat:

echo off
SETLOCAL
set SHELL=\\bin\\bash
set HOME=%~dp0..\..\doc\unix
bin\bash --login -i
ENDLOCAL

SETLOCAL e ENDLOCAL certificam-se de que SHELL e HOME não substituam as variáveis ​​env existentes para outros programas. HOME=%~dp0..\..\doc\unixdefine HOME como dois diretórios acima, no subdiretório doc / unix. Então, em .... \ doc \ unix.bashrc, eu incluo PATH="/bin:/usr/local/bin:/usr/X11R6/bin:/usr/bin". Eu não costumavastart /wait %CD%\bin\bash iniciar o bash, porque estou usando o Console2 , portanto, não preciso de uma janela cmd adicional.

P. Myer Nore
fonte
2

Usando a variável de ambiente do Windows: HOME

Isso funciona para mim para uma solução permanente, não portátil e sem rede; ou seja, definir a variável de ambiente HOME permanentemente no Windows.

Note que isto não afeta as sessões ssh ou telnet que sempre se referem a / etc / passwd

ref: Configurando Cygwin- Minha variável de ambiente HOME não é o que eu quero.

CMD

Para o usuário atual (precisa ser executado uma vez por usuário) ::

reg add HKCU\Environment /v HOME /t REG_EXPAND_SZ /d ^%USERPROFILE^%

Para novos usuários:

reg add HKU\.DEFAULT\Environment /v HOME /t REG_EXPAND_SZ /d ^%USERPROFILE^%

Nota: Carets ^ antes dos sinais de porcentagem%

IMPORTAR ARQUIVO REG

Importe este arquivo reg ( usuário atual ):

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Environment]
"HOME"=hex(2):25,00,55,00,53,00,45,00,52,00,50,00,52,00,4f,00,46,00,49,00,4c,\
  00,45,00,25,00,00,00

Para novos usuários:

Windows Registry Editor Version 5.00

[HKU\.DEFAULT\Environment]
"HOME"=hex(2):25,00,55,00,53,00,45,00,52,00,50,00,52,00,4f,00,46,00,49,00,4c,\
  00,45,00,25,00,00,00

REGEDIT

No Regedit, em:

Para o usuário atual :

HKEY_CURRENT_USER\Environment

Para novos usuários:

HKU\.DEFAULT\Environment

Crie HOME como um novo valor de string expansível (* REG_EXPAND_SZ *) e coloque em % USERPROFILE%

wyrdR
fonte
Quaisquer que sejam as informações em que essa resposta foi baseada, ela não é mais atual. O link ref: também está quebrado. Eu não tentaria isso em casa.
Christopher
2

Resposta original de Christopher de outro lugar

Cygwin 1.7.34+

Para aqueles que usam o Cygwin 1.7.34 ou superior, o Cygwin suporta a configuração de como obter o diretório inicial, o shell de login e as informações do gecos em /etc/nsswitch.conf. Isso está detalhado na seção do Guia do Usuário do Cygwin:

Se você já criou um arquivo /etc/passwdou anteriormente, /etc/groupvocê deseja removê-los e configurar o Cygwin usando o novo modelo de segurança do Windows para mapeamentos POSIX.

[[ -f /etc/passwd ]] && mv /etc/passwd /etc/passwd.bak
[[ -f /etc/group ]] && mv /etc/group /etc/group.bak

A configuração /etc/nsswitch.confdo arquivo db_home:define como o Cygwin busca o diretório pessoal do usuário. A configuração padrão para db_home:é

db_home: /home/%U

Portanto, por padrão, o Cygwin apenas define o diretório inicial como /home/$USERNAME. Você pode alterar isso para apontar para qualquer outro caminho personalizado que desejar. Os caracteres curinga suportados são:

  • %u O nome de usuário do Cygwin (u minúsculo).
  • %U O nome de usuário do Windows (U maiúsculo).
  • %D Domínio do Windows no estilo NetBIOS.
  • %HDiretório inicial do Windows no estilo POSIX. Observe que, para a db_home:configuração, isso só faz sentido logo após a barra anterior, como emdb_home: /%H/cygwin
  • %_Como os caracteres espaço e TAB são usados ​​para separar os esquemas, um espaço no nome do arquivo deve ser fornecido como %_(um sublinhado).
  • %% Um personagem por cento.

No lugar de um caminho, você pode especificar um dos quatro esquemas de caminho nomeados que são predefinidos.

  1. windowsO diretório inicial do usuário é definido para o mesmo diretório que é usado como diretório inicial do Windows, normalmente algo próximo a %USERPROFILE%ou C:\Users\$USERNAME. Claro, o diretório do Windows é convertido para o estilo POSIX pelo Cygwin.

  2. cygwinSomente AD: o diretório inicial do usuário é definido como o caminho POSIX fornecido no atributo cygwinHome da classe auxiliar cygwinUser. Veja também a seção chamada “O esquema cygwin” .

  3. unixSomente AD: O diretório inicial do usuário é definido como o caminho POSIX fornecido no atributo unixHomeDirectory da classe auxiliar posixAccount. Veja também a seção chamada “O esquema unix” .

  4. descO diretório inicial do usuário é definido como o caminho POSIX fornecido na configuração home = "..." semelhante ao XML no atributo de descrição do usuário no SAM ou AD. Consulte a seção chamada “O esquema desc” para uma descrição detalhada.

O seguinte fará com que o diretório inicial do usuário no Cygwin seja o mesmo que é usado para o diretório inicial do Windows.

db_home: windows

Cygwin 1.7.33 ou anterior

Para aqueles que usam o Cygwin 1.7.33 ou anterior, atualize para a versão mais recente do Cygwin e remova os arquivos usados ​​anteriormente /etc/passwde /etc/group, em seguida, consulte as etapas acima.

Caso contrário, siga estas etapas mais antigas abaixo.

Em primeiro lugar, defina uma variável de ambiente do Windows para HOME que aponte para o seu perfil de usuário:

  1. Abra Sistema no Painel de Controle
  2. Na guia Avançado, clique em Variáveis ​​de ambiente (na parte inferior)
  3. Na área Variáveis ​​do usuário, clique em "Novo ..."
  4. Para o nome da variável, insira HOME
  5. Para o valor da variável, insira %USERPROFILE%
  6. Clique em OK em todas as caixas de diálogo abertas para aplicar esta nova configuração

Agora vamos atualizar o /etc/passwdarquivo Cygwin com a %HOME%variável do Windows que acabamos de criar. Os logins do shell e os logins remotos via sshcontam com /etc/passwdpara informar a localização do $HOMEcaminho do usuário .

No prompt de comando Cygwin bash, digite o seguinte:

cp /etc/passwd /etc/passwd.bak
mkpasswd -l -p $(cygpath -H)  > /etc/passwd 
mkpasswd -d -p $(cygpath -H)  >> /etc/passwd 

A -dopção diz ao mkpasswd para incluir usuários DOMAIN, enquanto -lé apenas para usuários de máquina LOCAL de saída. Isso é importante se você estiver usando um PC no trabalho onde as informações do usuário são obtidas de um Controlador de Domínio do Windows.

Agora, você também pode fazer o mesmo para grupos, embora isso não seja necessário, a menos que você esteja usando um computador que faça parte de um domínio do Windows. O Cygwin lê as informações do grupo dos bancos de dados de contas do Windows, mas você pode adicionar um /etc/grouparquivo se sua máquina for freqüentemente desconectada de seu controlador de domínio.

No prompt do bash Cygwin, digite o seguinte:

cp /etc/group /etc/group.bak
mkgroup -l > /etc/group 
mkgroup -d >> /etc/group 

Agora, saia do Cygwin e inicie-o novamente. Você deve descobrir que seu caminho de HOME aponta para o mesmo local que seu Perfil de Usuário do Windows - ou seja,/cygdrive/c/Users/username

Christopher
fonte
1
cd /home
rm -rf chris
ln -s /cygdrive/z chris

Não tenho certeza se é a solução mais segura, mas é uma solução possível que funciona para mim;)

kitingChris
fonte
0

Editei meu arquivo / etc / passwd diretamente (certificando-se de que nada mais o acessaria) e alterei todas as referências a / home para ser / Usuários (no Windows 7). Descobri que, para que tudo funcione corretamente, tive que excluir todos os diretórios no diretório / home (ou movê-los para o outro local apropriado). Caso contrário, o cygwin desenvolveria uma personalidade dividida onde, por exemplo, 'bash -l' começaria em / home / Pablo, mas $ HOME seria / Users / Pablo e emacs pareceria fazer o contrário. Depois de deletar / home / Pablo, tudo funcionou bem.

Pablo Halpern
fonte
0

Eu só precisava estar dentro C:\Users\usernamequando iniciasse o cygwin. Então, acabei de adicionar .bashrce.profile

cd ${HOMEPATH}

Se você preferir usar em ~/.vez de $HOMEPATH, também pode adicionar o seguinte:

export HOME=${HOMEPATH}

Assim não atrapalho a instalação do cygwin.

user123456789
fonte