Como atualizar o Cygwin a partir da linha de comando do Cygwin?

73

Para pesquisar e baixar um pacote ausente do Cygwin, preciso executar a GUI do setup.exe toda vez, clique várias vezes e faça outras coisas chatas.

Existe uma maneira de fazer o mesmo diretamente da linha de comando do Cygwin? Como as ferramentas apt-get fazem.

Pavel Vlasov
fonte

Respostas:

40

Dê uma olhada aqui:

Além de outras coisas, fornece a seguinte lista de opções para setup.exe:

Command Line Options:
 -A --disable-buggy-antivirus           Disable known or suspected buggy anti
                    virus software packages during execution.
 -C --categories                        Specify entire categories to install
 -D --download                          Download from internet
 -d --no-desktop                        Disable creation of desktop shortcut
 -h --help                              print help
 -K --pubkey                            Path to extra public key file (gpg format)
 -L --local-install                     Install from local directory
 -l --local-package-dir                 Local package directory
 -n --no-shortcuts                      Disable creation of desktop and start menu
                    shortcuts
 -N --no-startmenu                      Disable creation of start menu shortcut
 -O --only-site                         Ignore all sites except for -s
 -P --packages                          Specify packages to install
 -p --proxy                             HTTP/FTP proxy (host:port)
 -q --quiet-mode                        Unattended setup mode
 -r --no-replaceonreboot                Disable replacing in-use files on next
                    reboot.
 -R --root                              Root installation directory
 -S --sexpr-pubkey                      Extra public key in s-expr format
 -s --site                              Download site
 -U --keep-untrusted-keys               Use untrusted keys and retain all
 -u --untrusted-keys                    Use untrusted keys from last-extrakeys
 -X --no-verify                         Don't verify setup.ini signatures

Então setup.exe -P <package name>deve fazer o trabalho. Não tenha o cygwin aqui, teste-o para confirmar se funciona como esperado.

Para procurar um pacote, por:

você pode usar cygcheck -p:

  cygcheck -p REGEXP
  ...
  -p, --package-query  search for REGEXP in the entire cygwin.com package
                       repository (requires internet connectivity)

que produz saída como (exemplo do site acima):

$ cygcheck -p 'libexpat.*\.a'
Found 2 matches for 'libexpat.*\.a'.

expat-1.95.7-1            XML parser library written in C
expat-1.95.8-1            XML parser library written in C
icyrock.com
fonte
9
Advertência: se a atualização for substituída cygwin1.dll, os programas Cygwin começarão a se comportar mal e as documentações do Cygwin recomendam uma reinicialização. Portanto, é melhor fechar todos os programas Cygwin e executar setup.exediretamente a partir de cmd(se você deseja automatizar, use um arquivo em lotes, não um script de shell).
Gilles 'SO- stop be evil'
Obrigado! Outra coisa de que preciso é a capacidade de pesquisar, porque ainda não sei qual pacote quero baixar. Uma vez que eu vou encontrar a lista completa dos pacotes que pude greppelo menos ...
Pavel Vlasov
Veja a edição para um exemplo.
Icyrock.com
22

Isso realiza uma atualização autônoma de todos os componentes cygwin

cd C:\cygwin
wget -N https://cygwin.com/setup-x86.exe
setup-x86.exe --no-desktop --no-shortcuts --no-startmenu --quiet-mode

Você deve reiniciar após a conclusão da atualização para evitar que os aplicativos cygwin se comportem incorretamente devido ao cygwin1.dll atualizado

--no-desktop Desativa a criação do atalho na área de trabalho

--no-shortcuts Desativa a criação da área de trabalho e o menu Iniciar

--no-startmenu Desativa a criação do atalho do menu Iniciar

- modo silencioso Modo de configuração autônoma

Johnny
fonte
Você se importaria de expandir a resposta para explicar o que cada comando faz?
Raystafarian
9
Acredito que agora você pode precisar de setup-x86_64.exe ou setup-x86.exe.
drescherjm
No cygwin 2.9, recebo zsh: command not found: setup.exe, mas o setup exe está aqui.
Timo
Se você estiver usando, no-shortcutspor que também precisaria no-desktope no-startmenu?
Hashim
Muito útil, eu nunca soube disso. Você pode até especificar quais pacotes instalar, o que economiza tempo. Veja aqui um exemplo: gist.github.com/piotrpolak/c616455f1da8dfc2d4e101afbfdcdc8d
Sridhar Sarnobat
10

Uma solução alternativa seria usar o apt-cygscript disponível no GitHub.

Chris Charabaruk
fonte
3
Ele não suporta a atualização do cygwin, eu acho.
thoni56
@ThomasNilsson, por que você acha isso?
André Chalella
11
Como você o executaria em um shell usando o cygwin1.dll. Claro que você poderia usar outro shell ...
thoni56
a pergunta "real" NÃO foi atualizada, mas "como instalar um pacote sem usar a interface do usuário da instalação", e esta é a resposta REAL ... realmente, é MUITO melhor do que a instalação -p, porque PODERÁ DIZER O QUE É faz, e não apenas colocar a sua fé cega na configuração
THESorcerer
7

O local para a configuração do Cygwin parece ter alterações e divisão. Agora você precisa

wget http://cygwin.com/setup-x86.exe

ou

wget http://cygwin.com/setup-x86_64.exe
Skip Huffman
fonte
Eu tenho um setup.bat com o conteúdo bin\wget.exe --timestamping http://www.cygwin.com/setup-x86_64.exe && start setup-x86_64.exe, certificando-me de sempre executar o instalador mais recente e baixar o instalador apenas se houver realmente uma nova versão (é isso que --timestamping faz), então o arquivo bat inicia
hanshenrik
4

O instalador permite a partir da linha de comando ( shell elevado , por favor):

setup-x86.exe --root c:\cygwin -q --upgrade-also

para a versão de 64 bits:

setup-x86_64.exe --root c:\cygwin -q --upgrade-also

Detalhes:

  • Substitua c:\cygwinpelo diretório de instalação raiz do CygWin.
  • Sugestão para fechar qualquer shell ou programa do CygWin (por exemplo: net stop sshdse você instalou o OpenSSH).
  • O parâmetro -qnão é obrigatório.

Funciona via GUI (shell do DOS) ou mesmo no console remoto (SSH ou telnet). Não testado no PowerShell (alguém fez?).

Exemplo de saída de atualização correta:

G:\Instalac\CygWin\v2.852>Starting cygwin install, version 2.852
User has backup/restore rights
Current Directory: g:\Instalac\CygWin\Packages
Could not open service McShield for query, start and stop. McAfee may not be installed, or we don't have access.
root: c:\cygwin system
Selected local directory: g:\Instalac\CygWin\Packages
net: Direct
Loaded cached mirror list
get_url_to_membuf http://cygwin.com/mirrors.lst
getUrlToStream http://cygwin.com/mirrors.lst
site: http://ftp.hawo.stw.uni-erlangen.de/cygwin/
get_url_to_membuf http://ftp.hawo.stw.uni-erlangen.de/cygwin/x86/setup.bz2
getUrlToStream http://ftp.hawo.stw.uni-erlangen.de/cygwin/x86/setup.bz2
get_url_to_membuf http://ftp.hawo.stw.uni-erlangen.de/cygwin/x86/setup.bz2.sig
getUrlToStream http://ftp.hawo.stw.uni-erlangen.de/cygwin/x86/setup.bz2.sig
Changing gid back to original
Visited: 122 nodes out of 4415 while creating dependency order.
Dependency order of packages: _autorebase base-cygwin cygwin _update-info-dir libgcc1 libiconv2 libintl8 alternatives libattr1 li
bgmp10 coreutils libstdc++6 terminfo libncursesw10 libreadline7 bash findutils sed base-files libuuid1 libblkid1 libsmartcols1 zl
ib0 util-linux bashdb zlib-devel binutils libbz2_1 bzip2 libffi6 libp11-kit0 libtasn1_6 p11-kit p11-kit-trust ca-certificates cry
pt libmpfr4 gawk editrights libpcre1 grep libsigsegv2 diffutils csih cygrunsrv popt libpopt0 cygutils cygwin-devel dash file liba
tomic1 libcloog-isl4 libgomp1 libisl10 libmpc3 libquadmath0 libssp0 w32api-headers w32api-runtime windows-default-manifest gcc-co
re libexpat1 liblzma5 libdb4.8 libgdbm4 libopenssl100 libsqlite3_0 libcharset1 libiconv libintl-devel libuuid-devel python gdb li
bargp getent groff gzip hostname info ipc-utils libncurses10 less libapr1 libiodbc2 libmysqlclient18 libcom_err2 libkrb5support0
libk5crypto3 libkrb5_3 libgssapi_krb5_2 libsasl2_3 libopenldap2_4_2 perl openssl libpq5 libaprutil1 libedit0 libproxy1 libneon27
libpipeline1 libserf1_0 login lynx make man-db mintty nano ncurses openssh procps psmisc rebase run screen subversion xz tar tzco
de vim-minimal which zsh
Changing gid to Administrators
Ending cygwin install

Se, durante a atualização, você teve problemas como estes:

The following DLLs couldn't be rebased due to errors:
  /usr/bin/cygcrypt-0.dll

ou:

The following DLLs couldn't be rebased because they were in use:
  /usr/bin/cygcrypt-0.dll

ou:

ReBaseImage (/usr/bin/cygcrypt-0.dll) failed with last error = 6

... então você deve refazer a recuperação após a instalação:

1.- Feche todos os shell, programas e serviços CygWin.
2.- Abrir c:\CygWin\bin\ash.execomo administrador (elevado).
3.- Corra /bin/rebaseall.

Sopalajo de Arrierez
fonte
11
Funciona para mim. Obrigado. É necessário baixar o último setup-x86.exe ou setup-x86_64.exe primeiro. E usando o cmd Executar como Administrador
Marslo
2
Não há quase nenhuma razão para executar a instalação como administrador ou com --root se você não estiver instalando para todos os usuários (por exemplo, onde o cygwin root exige que o administrador escreva para ...). setup-86[_x64].exe -Bpara executar como usuário atual. Mais tarde, você pode elevar para instalar o cygrunsrv como um serviço do Windows, se necessário.
cowbert
1

Senti essa necessidade há muito tempo. Eu costumava manter o arquivo do instalador baixado para que eu pudesse executá-lo para instalar, mas ocasionalmente, como o Cygwin seria atualizado, o arquivo do instalador fica desatualizado. Acabei criando um script do Powershell que eleva automaticamente, baixa o instalador e executa uma atualização autônoma. Eu o instalei na minha área de trabalho e posso apenas clicar com o botão direito do mouse e "Executar com o PowerShell" e ele executará uma atualização no local de todos os meus pacotes Cygwin. A única interação do usuário necessária é para o UAC e o prompt "Pressione qualquer tecla para continuar" no final. Também pode ser executado a partir da linha de comando, pois é apenas um script.

Eu tenho o código aqui por um tempo: http://pastebin.com/wMRctAuL

Eu copiei abaixo. Escrevi com a ajuda de algumas perguntas e respostas sobre o StackOverflow. :) Tudo o que você precisa fazer para poder executá-lo é ativar os scripts locais do Powershell em sua máquina . É uma solução completa, nativa do Windows.

# Get the ID and security principal of the current user account
$myWindowsID=[System.Security.Principal.WindowsIdentity]::GetCurrent()
$myWindowsPrincipal=new-object System.Security.Principal.WindowsPrincipal($myWindowsID)

# Get the security principal for the Administrator role
$adminRole=[System.Security.Principal.WindowsBuiltInRole]::Administrator

# Check to see if we are currently running "as Administrator"
if ($myWindowsPrincipal.IsInRole($adminRole)) {
   # We are running "as Administrator" - so change the title and background color to indicate this
   $Host.UI.RawUI.WindowTitle = $myInvocation.MyCommand.Definition + "(Elevated)"
   $Host.UI.RawUI.BackgroundColor = "DarkBlue"
   clear-host
}
else {
   # We are not running "as Administrator" - so relaunch as administrator

   # Create a new process object that starts PowerShell
   $newProcess = new-object System.Diagnostics.ProcessStartInfo "PowerShell";

   # Specify the current script path and name as a parameter
   $newProcess.Arguments = $myInvocation.MyCommand.Definition;

   # Indicate that the process should be elevated
   $newProcess.Verb = "runas";

   # Start the new process
   [System.Diagnostics.Process]::Start($newProcess);

   # Exit from the current, unelevated, process
   exit
}

# Run your code that needs to be elevated here
(new-object System.Net.WebClient).DownloadFile('http://cygwin.com/setup-x86_64.exe','setup-x86_64.exe')

if (!$?) {
   Write-Host "Something wrong happened when downloading the Cygwin installer."
   Write-Host -NoNewLine "Press any key to continue..."
   $null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
   exit
}

$p = Start-Process .\setup-x86_64.exe -ArgumentList "--upgrade-also --quiet-mode" -wait -NoNewWindow -PassThru

if ($p.ExitCode -ne 0) {
   Write-Host "Cygwin setup failed with an error!"
}

Remove-Item .\setup-x86_64.exe

Write-Host -NoNewLine "Press any key to continue..."
$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
Ben Richards
fonte
0

Expandindo a resposta de @ Johnny https://superuser.com/a/624731/110335

O aborrecimento que enfrentei foi a ocasião em que o arquivo .ini é de uma versão mais recente do setup.exe do Cygwin

Escrevi para mim mesmo o seguinte script para atualizar automaticamente e depois atualizar tudo o que for necessário, sem interatividade.

cygwinSetup64.cmd

@echo on
cd /d e:\cygwin
move /y cygwinSetup-x86_64.exe   setup-x86_64.exe
wget --progress=dot -S -N  http://cygwin.com/setup-x86_64.exe
move /y  setup-x86_64.exe cygwinSetup-x86_64.exe 

cygwinSetup-x86_64.exe   --no-desktop --no-shortcuts --no-startmenu --quiet-mode
Marcos
fonte
0

Atualização autônoma

https://cygwin.com/faq.html#faq.setup.cli

setup-x86.exe -q -g

Significado:

Command Line Options:
 -q --quiet-mode                   Unattended setup mode
 -g --upgrade-also                 also upgrade installed packages
KIM Taegyoon
fonte
0

Crie um arquivo em lotes como "cygwin-update.bat" com o seguinte conteúdo e coloque-o no seu caminho:

@echo off
"%~dp0\gnubin\wget.exe" --no-check-certificate https://www.cygwin.com/setup-x86_64.exe -O C:\cygwin64\setup-x86_64.exe
cd /d C:\cygwin64
setup-x86_64.exe -q -g
Dean Householder
fonte