AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 498488
Accepted
x-yuri
x-yuri
Asked: 2019-02-04 13:19:32 +0800 CST2019-02-04 13:19:32 +0800 CST 2019-02-04 13:19:32 +0800 CST

Como uso o ssh-agent como um programa wrapper?

  • 772

Estou tentando iniciar awesomeo gerenciador de janelas como um subprocesso do ssh-agent. Funcionou quando eu usei startx( ssh-agent startx). Mas agora estou tentando fazê-lo funcionar sob o lightdm.

lightdmcomeça /usr/bin/xinitrcsession-helper:

#!/bin/bash
exec $HOME/.xinitrc

~/.xinitrc:

ssh-agent awesome

E o que eu recebo é:

  509     1   lightdm         /usr/bin/lightdm
  526   509     Xorg            /usr/lib/Xorg :0 -seat seat0 -auth /run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch
  877   509     lightdm         lightdm --session-child 14 21
 1003   877       xinitrcse       /bin/bash /usr/bin/xinitrcsession-helper
 1028  1003         awesome         awesome
 1029  1028           ssh-a           ssh-agent awesome

E set | grep SSHnão retorna nada.

Então eu começo outro xterm( ssh-agent xterm) e funciona:

 1636     1   xterm           xterm
 1638  1636     bash            bash
 1651  1638       vim             vim
 9435  1651         xterm           xterm
 9447  9435           ssh-a           ssh-agent xterm
 9449  9435           bash            bash
10464  9449             ps              ps -eHo pid,ppid,comm,args
10465  9449             les             less

O estranho aqui é que ssh-agenté filho de um programa que ele inicia. Você pode explicar isso?

E como eu corro awesomepara que os programas que eu inicie depois disso possam ver ssh-agent?

UPD Quanto ssh-agenta ser filho do comando que executa. Isso é feito para poder substituir commandpor ssh-agent command. Então, ssh-agentbifurca, e pai execé o command.

UPD Meu mal, eu estava usando xbindkeyspara iniciar xterm, e o primeiro passou a ser iniciado antes ssh-agent. Como em, xbindkeys && ssh-agent awesome. Então, não tinha SSH_*variáveis ​​para passar para xterm. Ou então é a minha explicação mais provável. Ao usar awesomeas facilidades internas do start xterm, as variáveis ​​de ambiente são passadas corretamente.

environment-variables ssh-agent
  • 1 1 respostas
  • 832 Views

1 respostas

  • Voted
  1. Best Answer
    Kusalananda
    2019-03-14T14:34:01+08:002019-03-14T14:34:01+08:00

    Em sua atualização, você mencionou que você começa e xtermdesde xbindkeysque você executa

    xbindkeys && ssh-agent awesome
    

    bindkeysnão terá o ambiente relacionado ao SSH e, como consequência disso, xtermtambém não terá.

    Para resolver isso, sugiro

    eval "$(ssh-agent)"
    xbindkeys && awesome
    

    Agora, isso definiria as variáveis ​​para xbindkeyse awesome(o que pode ser o que você precisa e deseja), mas não mataria automaticamente o ssh-agentprocesso quando você fizer logout.

    Para isso, você pode usar (com bash),

    eval "$(ssh-agent)"
    trap 'eval "$(ssh-agent -k)"' EXIT
    xbindkeys && awesome
    

    ou algo semelhante. Isso faria uma chamada ssh-agent -kque mataria o agente, assim que o shell saísse ou fosse encerrado por TERM, HUPou INT.

    A execução evalna saída de ssh-agent -kapenas desativaria as variáveis ​​SSH e pode não ser necessária (já que o script está prestes a sair de qualquer maneira), portanto, a armadilha pode ser configurada para ser executada apenas ssh-agent -k >/dev/nullem vez disso.


    A coisa sobre ssh-agentser um processo filho do comando que ele inicia parece estranho.

    ssh-agentbifurca o processo do agente real e, em seguida, substitui o processo original pelo do comando que deve ser executado (usando exec()). O resultado é que o processo original ( xtermem sua segunda árvore de processos) é o pai do agente:

    /*
     * Fork, and have the parent execute the command, if any, or present
     * the socket data.  The child continues as the authentication agent.
     */
    if (D_flag || d_flag) {
            log_init(__progname,
                d_flag ? SYSLOG_LEVEL_DEBUG3 : SYSLOG_LEVEL_INFO,
                SYSLOG_FACILITY_AUTH, 1);
            format = c_flag ? "setenv %s %s;\n" : "%s=%s; export %s;\n";
            printf(format, SSH_AUTHSOCKET_ENV_NAME, socket_name,
                SSH_AUTHSOCKET_ENV_NAME);
            printf("echo Agent pid %ld;\n", (long)parent_pid);
            fflush(stdout);
            goto skip;
    }
    pid = fork();
    if (pid == -1) {
            perror("fork");
            cleanup_exit(1);
    }
    if (pid != 0) {         /* Parent - execute the given command. */
            close(sock);
            snprintf(pidstrbuf, sizeof pidstrbuf, "%ld", (long)pid);
            if (ac == 0) {
                    format = c_flag ? "setenv %s %s;\n" : "%s=%s; export %s;\n";
                    printf(format, SSH_AUTHSOCKET_ENV_NAME, socket_name,
                        SSH_AUTHSOCKET_ENV_NAME);
                    printf(format, SSH_AGENTPID_ENV_NAME, pidstrbuf,
                        SSH_AGENTPID_ENV_NAME);
                    printf("echo Agent pid %ld;\n", (long)pid);
                    exit(0);
            }
            if (setenv(SSH_AUTHSOCKET_ENV_NAME, socket_name, 1) == -1 ||
                setenv(SSH_AGENTPID_ENV_NAME, pidstrbuf, 1) == -1) {
                    perror("setenv");
                    exit(1);
            }
            execvp(av[0], av);
            perror(av[0]);
            exit(1);
    }
    

    (o processo filho continua executando o resto do código)

    Isso permite que você mate o agente sem muitas consequências para o comando que você deseja executar, por exemplo.

    • 2

relate perguntas

  • Encontre o caminho de onde a variável $CDPATH está localizada?

  • definir o caminho do diretório de inclusão (para *.h) CentOS

  • $PAGER pode conter espaços?

  • Posso definir manualmente vários proxies no ambiente?

  • servidor ssh: controle a proteção da chave ssh com senha

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve