.png)
Planeo ejecutar aplicaciones potencialmente peligrosas(navegador, etc.)en un servidor X separado, pero como cada servidor tiene su propio portapapeles, es imposible copiar el enlace/texto de una ventana a otra.
La mayoría de los artículos sugieren hacer esto usando scripts que usen xclip y otras utilidades similares.
Pero comoCORRECTAMENTE¿Crear un portapapeles común para no crear accidentalmente una nueva vulnerabilidad?
Respuesta1
NOTA: Actualización de la respuesta para reflejar el cambio de estrategia: en lugar de ejecutar Xephyr en un servidor/contenedor, lo estoy ejecutando en un entorno host/de uso principal. La razón de esto es que ejecutar Xephyr en el servidor/contenedor es como poner un candado en una puerta interior en lugar de en la puerta principal: los malos actores rodearían la puerta interior y accederían al portapapeles directamente a través del enchufe remoto de X pipe.
Al enfrentar el mismo problema de vulnerabilidad del portapapeles, lo abordé ejecutando un Xephyr en el host (mi espacio de trabajo personal) y reenviando X desde los servidores en contenedores al Xephyr local.
Xephyr se ejecuta en la pantalla ':2' mientras que las ventanas y el navegador de mi espacio de trabajo personal se ejecutan en la pantalla predeterminada ':0'. Estas dos pantallas no comparten un portapapeles: cada una tiene su propio portapapeles. Esa es la única manera de evitar espiar el portapapeles de mi espacio de trabajo personal en la pantalla ':0'. Luego tengo configuradas teclas de acceso rápido (por ejemplo, teclas de función), una para transferir el contenido del portapapeles de ':0' a ':2' y otra para ':2' a ':0', permitiendo así un control total.
En el script de shell, el código podría verse así
xsel --display :0 --clipboard -o | xsel --display :2 --clipboard -i
aunque estoy usando javascript como se muestra al final de esta publicación.
El script de Shell para iniciar el reenvío X podría verse así
Xephyr <args> :2
DISPLAY=:2 ssh -X -R 44713:localhost:4713 user@container <<EOF
DISPLAY=:10 PULSE_SERVER=tcp:localhost:44713 openbox --startup firefox
EOF
aunque estoy usando un programa javascript para hacerlo.
Aquí está el código javascript para copiar entre ':0' y ":2", que se asigna mediante teclas de acceso rápido. Puede ver que aparece un cuadro de mensaje transitorio para confirmar que funcionó.
#!/usr/bin/env node
`strict`;
const child_process = require('child_process');
// TODO: write unviewable error messasges to system log
function notifySend(title, msg){
title = title.replace(/"/g, '\\"');
msg = msg.replace(/"/g, '\\"');
//msg = msg.replace(/'/g, '\\'')
try {
child_process.execSync(`notify-send "${title}" "${msg}"`);
} catch(e) {
console.log(`system call "notify-send" failed with ${e.message}`);
}
}
async function clipXfer(fromDispNum,toDispNum){
var clipValue;
let cmd1 = `xsel --display :${fromDispNum} --clipboard --output`;
let cmd2 = `xsel --display :${toDispNum} --clipboard --input`;
try {
clipValue = child_process.execSync(cmd1, { encoding: 'utf-8' });
} catch(e) {
throw Error(`Display ${fromDispNum} clipboard is empty`);
}
await new Promise((resolve, reject)=>{
// eslint-disable-next-line no-unused-vars
var proc = child_process.exec(cmd2, (error, stdout, stderr) => {
//if (stdout) console.log(stdout);
//if (stderr) console.log(stderr);
if (error) {
reject(Error(`${error.message}`));
}
resolve();
});
if (!proc.stdin.write(clipValue))
reject(Error('clipToCont(), pipe write failed'));
proc.stdin.end();
});
}
async function main()
{
let argOff=2;
if (process.argv.length-argOff<2)
throw Error('clip-xfer requires two arguments: fromDispNum, toDispNum');
let fromDispNum = process.argv[argOff];
let toDispNum = process.argv[argOff+1];
argOff+=2;
let f = (outcome)=>{
notifySend("clipXfer", `${fromDispNum} => ${toDispNum} ${outcome}`);
};
await clipXfer(fromDispNum,toDispNum)
.then(f('SUCCESS'))
.catch((e)=>{f(`FAILURE, ${e.message}`); throw e;});
}
//console.log(process.argv);
//console.log(process.env);
main()
.then(()=>{process.exitCode=0;})
.catch((e)=>{
console.log(e);
process.exitCode=1;
});
Respuesta2
yo sueloxclipsync. Funciona en un 98%. En el 2% estoy haciendo esto:
En pantalla: 0 ejecutarcopiaq. En exhibición: 1 ejecuciónparcelalita. Para sincronizar el portapapeles lo uso
copyq add $(parcellite)
o hacia atrás
copyq read | parcellite -c
¡Funciona al 100%! :-)