Quais são as outras maneiras de compartilhar uma sessão tmux entre dois usuários?

106

Estou procurando uma maneira limpa e fácil de compartilhar uma sessão tmux com outro usuário na mesma máquina. Eu tentei a -S socket-pathopção, mas requer a abertura de todas as permissões do caminho do soquete antes que alguém possa se conectar à sessão. Funciona, mas é um pouco complicado. Por exemplo:

# Me
$ tmux -S /tmp/pair
$ chmod 777 /tmp/pair

# Another user
$ tmux -S /tmp/pair attach

Isso funciona, mas agora os dois usuários compartilham a mesma configuração do tmux (a configuração do usuário que iniciou a sessão). Existe uma maneira de permitir que os dois usuários usem sua própria configuração do tmux e suas próprias ligações de teclas do tmux?

Para pontos de bônus, idealmente, também seria bom fornecer acesso somente leitura da sessão tmux a outros usuários.

Ryan McGeary
fonte
10
Sou muito preguiçoso, apenas uso sua pergunta como resposta: D
phunehehe

Respostas:

46

Em https://github.com/zolrath/wemux :

O wemux aprimora o tmux para tornar a multiplexação de terminal multiusuário mais fácil e mais poderosa. Ele permite que os usuários hospedem um servidor wemux e façam com que os clientes participem:

O Modo Espelho fornece aos clientes (outro usuário SSH em sua máquina) acesso somente leitura à sessão, permitindo que eles vejam seu trabalho ou

O modo de pareamento permite que o cliente e você trabalhem no mesmo terminal (cursor compartilhado)

O Rogue Mode permite que o cliente emparelhe ou trabalhe independentemente em outra janela (cursores separados) na mesma sessão do tmux.

Possui suporte para vários servidores, bem como listagem e notificações de usuários quando os usuários se conectam / desanexam.

É um wrapper shellscript sobre tmux - não é necessário compilar.

Peter
fonte
16

Eu tentei isso no Ubuntu, mas não vejo por que não funcionaria em outras variantes do unix.

Se os dois usuários forem membros de um grupo comum e o caminho do soquete usar esse grupo, os dois serão capazes de se conectar bem.

Em vez de precisar alterar as permissões do caminho do soquete toda vez que você cria um, você pode criar um diretório específico para soquetes (usei / var / tmux).

Primeiro adicione um grupo para usuários do tmux

$ addgroup $TMUX_GROUP

Crie um diretório com o grupo definido como $ TMUX_GROUP e use o bit setgid para que os arquivos criados dentro do diretório tenham automaticamente o grupo definido como $ TMUX_GROUP.

$ mkdir /var/tmux
$ chgrp $TMUX_GROUP /var/tmux
$ chmod g+ws /var/tmux

Em seguida, verifique se os usuários que desejam compartilhar a sessão são membros de $ TMUX_GROUP

$ usermod -aG $TMUX_GROUP user1
$ usermod -aG $TMUX_GROUP user2
Stephen Paulger
fonte
2
Se você possui um sistema de arquivos que suporta ACLs , não precisa usar um grupo (e, em particular, não precisa de nenhuma intervenção raiz). Mas isso não resolve o problema de compartilhar a configuração do tmux , resolve ?
Gilles
3
Para criar sesion compartilhada: tmux -S $TMUX_GROUP/shared-session. Para anexar a ele de outra conta:tmux -S $TMUX_GROUP/shared-session attach
jfs
O comentário acima (por @JFSebastian) deve fazer parte da resposta. A configuração proposta é boa, mas a resposta é insuficiente ao explicar como usá-la de verdade. E para todas as respostas nesta página, essa é a que melhor resolve o problema.
Dr Beco
12

Tanto quanto eu sei, não é possível compartilhar sessões com outros usuários de uma maneira "limpa".

Além disso, o acesso somente leitura não é possível se o cliente não usar a -ropção.

Como outra tela de terminal multiplexador suporta os recursos que você procura, infelizmente também de maneira complicada ... Não tenho certeza se essa é uma opção para você, mas talvez alguém ache isso útil.

Solução para tela :

Organize uma sessão:

  • O bit SUID da tela deve estar definido: - /
  • Abra a sessão com screen -S sessionname
  • ctrla + :multiuser on
  • ctrla + :acladd otherUsername

Participe de uma sessão:

  • screen -x username/sessionname

Você pode definir bits de permissão para o usuário (* para todos) com :aclchgou :chacl. # anexado afetará janelas,? anexado afetará os comandos.

Exemplos:

  • :aclchg * -wx "#,?" definirá as permissões da sessão como somente leitura para todos os usuários
  • :aclchg foo +w 2 dará acesso de gravação para o usuário foo na janela 2
  • :aclchg bar +x detach dará permissão para desanexar uma sessão na barra do usuário
echox
fonte
Pelo que vale, sinto que a solução tmux (embora um pouco mais detalhada) é realmente "mais limpa", pois não envolve deixar binários setuid flutuando pelo sistema de arquivos.
Glyph
Infelizmente, o tmux usado dessa maneira tem um problema de segurança: aqueles a quem você dá acesso podem facilmente criar novas sessões e fazer coisas que você não está vendo.
Curt J. Sampson
9

Isso não é exclusivo do tmux, mas agora é o que estou usando:

Você pode usar script -f /path/to/some/filepara gravar uma sessão do terminal em um arquivo. A -fopção atualiza o arquivo enquanto você digita.

Outra pessoa (com apenas permissões de leitura para o arquivo, se desejar) pode fazer tail -fpara ver o arquivo, sua sessão do terminal. A -fopção faz com que a tailsaída seja anexada.

A combinação dos dois "sincroniza" a visualização de um terminal. Quando usado com o tmux, também tem a vantagem de evitar o redimensionamento que ocorre quando os dois usuários têm resoluções diferentes. Outra característica é que cada usuário pode trabalhar em outra janela ou sessão privada.

Um inconveniente em potencial é que alguns comandos (ncurses baseados, por exemplo) podem fazer coisas estranhas na saída, escapar sequências também (cores). No entanto, estou usando isso dentro do tmux, e parece que o tmux corrige esses problemas. Eu posso ver o outro usuário ler as páginas de manual e usar outros comandos que criam buffers, as cores são exibidas corretamente, etc.

Isso não permite gravar no terminal um do outro (talvez alguma outra solução possa ser adicionada para isso).

Eu gosto de ter uma janela com dois painéis: um painel correndo script -fpara o meu colega ver, e outro próximo a ele onde tail -fé terminal.

Também funciona em ttys (e soquetes ou pipes nomeados também podem ser usados ​​para o arquivo)

ferhtgoldaraz
fonte
Eu gosto da sua resposta! Isso é simples e funcional!
JL