여러 X11 서버(Xepyr, Xpra 등) 간의 공유 클립보드

여러 X11 서버(Xepyr, Xpra 등) 간의 공유 클립보드

잠재적으로 위험한 애플리케이션을 실행할 계획입니다.(브라우저 등)별도의 X 서버에 있지만 각 서버에는 자체 클립보드가 있으므로 링크/텍스트를 한 창에서 다른 창으로 복사하는 것은 불가능합니다.

대부분의 기사에서는 xclip 및 기타 유사한 유틸리티를 사용하는 스크립트를 사용하여 이 작업을 수행할 것을 제안합니다.

하지만 어떻게바르게실수로 새로운 취약점이 생성되지 않도록 공통 클립보드를 생성하시겠습니까?

답변1

참고: 전략 변경을 반영하기 위해 답변 업데이트 - Xephyr을 서버/컨테이너에서 실행하는 대신 호스트/주 사용 환경에서 실행하고 있습니다. 그 이유는 서버/컨테이너에서 Xephyr를 실행하는 것은 현관문 대신 내부 문에 자물쇠를 두는 것과 같기 때문입니다. 악의적인 행위자는 내부 문을 돌아다니며 X 파이프 원격 소켓을 통해 직접 클립보드에 액세스할 것입니다.

동일한 클립보드 취약점 문제에 직면하여 호스트(내 개인 작업 공간)에서 Xephyr을 실행하고 Xephyr을 컨테이너 기반 서버에서 로컬 Xephyr로 전달하는 방식으로 접근했습니다.

내 개인 작업 공간 창과 브라우저가 기본 디스플레이 ':0'에서 실행되는 동안 Xepyr은 ':2' 디스플레이에서 실행됩니다. 이 두 디스플레이는 클립보드를 공유하지 않습니다. 각각 자체 클립보드가 있습니다. 이것이 디스플레이 ':0'에 있는 개인 작업 공간 클립보드의 스누핑을 방지하는 유일한 방법입니다. 그런 다음 단축키(예: 기능 키)를 설정했는데, 하나는 클립보드 내용을 ':0'에서 ':2'로 전송하고 다른 하나는 ':2'에서 ':0'으로 전송하여 완전한 제어를 허용합니다.

쉘 스크립트에서 코드는 다음과 같습니다.

xsel --display :0 --clipboard -o |  xsel --display :2 --clipboard -i

이 게시물 하단에 표시된 대로 자바스크립트를 사용하고 있습니다.

X 전달을 시작하는 쉘 스크립트는 다음과 같습니다.

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

비록 나는 그것을 하기 위해 자바스크립트 프로그램을 사용하고 있지만.

다음은 단축키로 매핑되는 ':0'과 ':2' 사이를 복사하기 위한 자바스크립트 코드입니다. 작동했음을 확인하기 위해 일시적인 메시지 상자가 나타나는 것을 볼 수 있습니다.

#!/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;
  });

답변2

나는 사용한다xclipsync. 98%에서 작동합니다. 2%에서는 다음을 수행합니다.

dislpay에서 :0 실행카피. 전시 중 : 1회 실행소포. 클립보드를 동기화하려면 내가 사용하는

copyq add $(parcellite)

아니면 뒤로

copyq read | parcellite -c

100% 작동합니다! :-)

관련 정보