コマンドラインのみのDebianゲストを使用したVirtualboxの共有クリップボード


14

Virtualboxを使用してWindows 7ホストにDebianゲストをインストールしています。インストールにはデフォルトでvirtualbox-ose-guest-utilsが含まれていたため、必要なものはすべて揃っているはずです。共有クリップボードを有効にするにはどうすればよいですか?


SSHサーバーをインストールしてから、SSHセッションを介してものを貼り付けることができます。
ロビンディンセ

回答:


10

コマンドラインのみのゲストでは共有クリップボードを使用できないと思います。

これは、TTYがゲスト追加で使用できる適切なクリップボードを実際に作成しないためです。そのためには完全なGUIが必要です。

SSHを使用してホストからゲストにログインする方が良いでしょう。そうすれば、SSHクライアントの機能(Puttyなど)を使用してクリップボードを共有できます。


または、シリアル回線の代わりに、シリアル接続のすべての欠点があります(動的サイズ変更なしなど)。
phk

8

これを行うことができます。以下では双方向で作業することはできませんでしたが、ホストからゲスト(つまり、コンテンツをテキストコンソールに貼り付ける)は機能します。以下の手順はCentOS 5/6/7向けですが、同様のメカニズムが他のフレーバーでも機能するはずです。

これにより、X11クリップボードとgpmクリップボードの同期が維持されます。共有クリップボード設定が「ホストからゲスト」に設定されている場合、VirtualBoxはホストクリップボードが変更されるとX11クリップボードを更新します。中央のマウスボタン。

共有クリップボード

「ホストからゲスト」クリップボード共有を取得して、サーバー/コンソールモードで動作させることができます。おそらくVBoxClientとXvfbの間の問題が原因で、「ホストへのゲスト」共有は現在機能していません。

Xvfbをインストールする

    Xvfbをインストールする

VBoxClientをインストールする

    / dev / cdrom / mntをマウントします
    /mnt/VBoxLinuxAdditions.run

xclipをインストール

xclip(http://sourceforge.net/projects/xclip/)を/ usr / local / bin / xclipとしてダウンロード、コンパイル、インストールします。

パッチを適用したgpmをインストールします(xclip統合を使用)

最新のgpmソースをダウンロードし、次の変更を適用してパッチを適用します。

バイナリを/ usr / local / bin / xclip-gpmとしてインストールします。

これは、Alex Efros(http://powerman.name/patch/gpm.html)によるパッチの更新バージョンです。

gpm-1.20.7-xclip-support.patch

diff -rupN gpm-1.20.7-orig/src/daemon/do_selection.c gpm-1.20.7-xclip/src/daemon/do_selection.c
--- gpm-1.20.7-orig/src/daemon/do_selection.c   2012-10-27 10:21:38.000000000 +1300
+++ gpm-1.20.7-xclip/src/daemon/do_selection.c  2014-07-29 13:40:19.546689653 +1200
@@ -19,18 +19,49 @@
  *
  ********/

+#include <sys/stat.h>
+#include <sys/wait.h>
 #include "headers/message.h"        /* messaging in gpm */
 #include "headers/daemon.h"         /* daemon internals */
 #include "headers/gpmInt.h"         /* daemon internals */
+#include "headers/xcap.h"         /* daemon internals */

 /*-------------------------------------------------------------------*/
 int do_selection(Gpm_Event *event)  /* returns 0, always */
 {
    static int x1=1, y1=1, x2, y2;
+  
+   /* XCaP start */
+   struct stat X0;
+   FILE *xclip;
+   /* XCaP end */
+
 #define UNPOINTER() 0

    x2=event->x; y2=event->y;
    switch(GPM_BARE_EVENTS(event->type)) {
+       
+      /* XCaP start */
+      case GPM_UP:
+         if(event->buttons==GPM_B_LEFT) {
+             /* check Xwindow: if Xwindow not active - xclip freeze for 6 sec :( */
+             if (stat("/tmp/.X11-unix/X0", &X0) != -1) {
+                 if (!(xclip=popen("/usr/local/bin/xclip -d :0 -i", "w")))
+                     gpm_report(GPM_PR_OOPS,"open pipe");
+                 /* send currect selection to Xwindow clipboard */
+                 fwrite(sel_buffer, sizeof(char), sel_buffer_lth, xclip);
+                 if (!WIFEXITED(pclose(xclip)))
+                     gpm_report(GPM_PR_OOPS,"close pipe");
+             }
+             /*resize sel_buffer back to "normal" size*/
+             if(sel_buffer_lth>SCR_SIZE) {
+                 free(sel_buffer);
+                 sel_buffer=malloc(SCR_SIZE);
+                 sel_buffer_lth=SCR_SIZE;
+             }
+         }
+      /* XCaP end */
+
       case GPM_MOVE:
          if (x2<1) x2++; else if (x2>maxx) x2--;
          if (y2<1) y2++; else if (y2>maxy) y2--;
diff -rupN gpm-1.20.7-orig/src/daemon/loadlut.c gpm-1.20.7-xclip/src/daemon/loadlut.c
--- gpm-1.20.7-orig/src/daemon/loadlut.c    2012-10-27 10:21:38.000000000 +1300
+++ gpm-1.20.7-xclip/src/daemon/loadlut.c   2014-07-29 13:40:29.895722875 +1200
@@ -30,6 +30,8 @@
 #include "headers/daemon.h"         /* daemon internals */
 #include "headers/gpmInt.h"         /* GPM_SYS_CONSOLE  */

+#include "headers/xcap.h"
+
 int loadlut(char *charset)
 {
    int i, c, fd;
@@ -47,7 +49,9 @@ int loadlut(char *charset)
    };


+/*
 #define inwordLut (long_array+1)
+*/

    for (i=0; charset[i]; ) {
       i += getsym(charset+i, &this);
@@ -56,9 +60,15 @@ int loadlut(char *charset)
       else
          next = this;
       for (c = this; c <= next; c++)
-         inwordLut[c>>5] |= 1 << (c&0x1F);
+         (long_array+1)[c>>5] |= 1 << (c&0x1F);
    }

+   /* XCaP */
+   /* used in mode=1 (word-by-word selection) */
+   for (i=0; i<8; i++) 
+      inwordLut[i] = long_array[i+1];
+   /* XCaP */
+
    if ((fd=open(option.consolename, O_WRONLY)) < 0) {
       /* try /dev/console, if /dev/tty0 failed -- is that really senseful ??? */
       free(option.consolename); /* allocated by main */
diff -rupN gpm-1.20.7-orig/src/daemon/old_main.c gpm-1.20.7-xclip/src/daemon/old_main.c
--- gpm-1.20.7-orig/src/daemon/old_main.c   2012-10-27 10:21:38.000000000 +1300
+++ gpm-1.20.7-xclip/src/daemon/old_main.c  2014-07-29 13:40:36.184743068 +1200
@@ -33,6 +33,8 @@
 #include "headers/daemon.h"         /* daemon internals */
 #include "headers/gpmInt.h"         /* daemon internals */

+#include "headers/xcap.h"         /* daemon internals */
+
 #ifndef max
 #define max(a,b) ((a)>(b) ? (a) : (b))
 #endif
@@ -73,6 +75,11 @@ int old_main()
       maxfd=max(fd, maxfd);
    }

+   /* XCaP start */
+   sel_buffer=malloc(SCR_SIZE);
+   sel_buffer_lth=SCR_SIZE;
+   /* XCaP end */
+
 /*....................................... catch interesting signals */

    signal(SIGTERM, gpm_killed);
diff -rupN gpm-1.20.7-orig/src/daemon/selection_copy.c gpm-1.20.7-xclip/src/daemon/selection_copy.c
--- gpm-1.20.7-orig/src/daemon/selection_copy.c 2012-10-27 10:21:38.000000000 +1300
+++ gpm-1.20.7-xclip/src/daemon/selection_copy.c    2014-07-29 13:40:42.677763908 +1200
@@ -22,11 +22,28 @@
 #include <fcntl.h>                  /* open              */
 #include <unistd.h>                 /* close             */
 #include <time.h>                   /* time              */
+#include <sys/kd.h>


 #include "headers/message.h"        /* messaging in gpm */
 #include "headers/daemon.h"         /* daemon internals */

+#include "headers/xcap.h"
+
+/* XCaP start */
+/* inword() from /usr/src/linux-2.4.19/drivers/char/selection.c */
+static inline int inword(const unsigned char c) {
+    return ( inwordLut[c>>5] >> (c & 0x1F) ) & 1;
+}
+/* atedge() from /usr/src/linux-2.4.19/drivers/char/selection.c */
+static inline int atedge(const int p, int size_row)
+{
+    /* p+2 changed to p+1 because kernel operate with screen address */
+    return (!(p % size_row) || !((p + 1) % size_row));
+}
+/* XCaP end */
+
+
 void selection_copy(int x1, int y1, int x2, int y2, int mode)
 {
 /*
@@ -37,6 +54,106 @@ void selection_copy(int x1, int y1, int 
    unsigned short *arg = (unsigned short *)buf + 1;
    int fd;

+   /* XCaP start */
+   int i, j;              /* loop variables */
+   FILE *co_fptr;         /* file with current console image */
+   char scr[SCR_SIZE];            /* current console image */
+   int scr_lth;           /* current console image size */
+   char scrmap[E_TABSZ];   /* current screen map for inverse translation */
+   int p1, p2;                    /* cursor top/left and bottom/right position */
+   int n1, n2;                    /* selection top/left and bottom/right position */
+   int tmp;               /* temp integer */
+   char *bp, *obp;        /* temp pointers to fill sel_buffer */
+
+   /* read data from the console */
+   if( ((co_fptr=fopen("/dev/vcs","r"))==NULL) && /* usual /dev/ */
+      ((co_fptr=fopen("/dev/tty0","r"))==NULL) ) /*  */
+          gpm_report(GPM_PR_OOPS, "open /dev/vcs or /dev/tty0");
+   scr_lth = fread(&scr, sizeof(char), SCR_SIZE-1, co_fptr);
+   fclose(co_fptr);
+   scr[scr_lth] = 0;
+   /* unmap font translation */
+   /* ... is it possible to use kernel's inverse_translate() here? */
+   if ((fd=open_console(O_RDONLY))<0)
+      gpm_report(GPM_PR_OOPS,GPM_MESS_OPEN_CON);
+   if (ioctl(fd,GIO_SCRNMAP,&scrmap))
+      gpm_report(GPM_PR_OOPS,"GIO_SCRNMAP");
+   close(fd);
+   for (j=0; j<scr_lth; j++) {
+      for (i=0; i<E_TABSZ; i++)
+          if ((unsigned char) scrmap[i] == (unsigned char) scr[j])
+              break;
+      scr[j] = (char) i;
+   }
+   /* calc start-position and how many bytes to copy */
+   if (y1>y2) { tmp=y1; y1=y2; y2=tmp; tmp=x1; x1=x2; x2=tmp; }
+   if (y1==y2 && x1>x2) { tmp=x1; x1=x2; x2=tmp; }
+   p1 = (y1-1)*win.ws_col+x1-1;
+   p2 = (y2-1)*win.ws_col+x2-1;
+   n1 = 0;
+   n2 = 0;
+   /* selection logic from /usr/src/linux-2.4.19/drivers/char/selection.c */
+   if (mode==0) { /* character-by-character selection */
+      n1=p1;
+      n2=p2;
+   }
+   if (mode==1) { /* word-by-word selection */
+      tmp = isspace(scr[p1]);
+      for (n1 = p1; ; p1--) {
+          if ((tmp && !isspace(scr[p1])) || (!tmp && !inword(scr[p1])))
+              break;
+          n1 = p1;
+          if (!(p1 % win.ws_col))
+              break;
+      }
+      tmp = isspace(scr[p2]);
+      for (n2 = p2; ; p2++) {
+          if ((tmp && !isspace(scr[p2])) || (!tmp && !inword(scr[p2])))
+              break;
+          n2 = p2;
+          if (!((p2+1) % win.ws_col))
+              break;
+      }
+   }
+   if (mode==2) { /* line-by-line selection */
+      n1 = p1 - p1 % win.ws_col;
+      n2 = p2 + win.ws_col - p2 % win.ws_col - 1;
+   }
+   /* select to end of line if on trailing space */
+   if (n2 > n1 && !atedge(n2, win.ws_col) && isspace(scr[n2])) {
+      for (p2 = n2+1; ; p2++)
+          if (!isspace(scr[p2]) || atedge(p2, win.ws_col))
+              break;
+      if (isspace(scr[p2]))
+          n2 = p2;
+   }
+   /* save selection to sel_buffer */
+   if (mode<3) {
+      /* is the buffer big enough? */
+      if(((n2-n1+1)>=sel_buffer_lth) && ((n2-n1+1)>=SCR_SIZE)) {
+          free(sel_buffer);
+          sel_buffer=malloc((n2-n1+1)+1);
+      }
+      /* save selection, replac<C5> trailing spaces to \n in each line */
+      bp = sel_buffer;
+      obp= sel_buffer;
+      for (i = n1; i <= n2; i++ ) {
+          *bp = scr[i];
+          if (!isspace(*bp++))
+              obp = bp;
+          if (! ((i+1) % win.ws_col)) {
+              if (obp != bp) {
+                  bp = obp;
+                  *bp++ = '\n';
+              }
+              obp = bp;
+          }
+      }
+      sel_buffer_lth = bp - sel_buffer;
+      *(sel_buffer+sel_buffer_lth) = 0;
+   }
+   /* XCaP end */
+
    buf[sizeof(short)-1] = 2;  /* set selection */

    arg[0]=(unsigned short)x1;
diff -rupN gpm-1.20.7-orig/src/daemon/selection_paste.c gpm-1.20.7-xclip/src/daemon/selection_paste.c
--- gpm-1.20.7-orig/src/daemon/selection_paste.c    2012-10-27 10:21:38.000000000 +1300
+++ gpm-1.20.7-xclip/src/daemon/selection_paste.c   2014-07-29 13:40:48.754783436 +1200
@@ -22,15 +22,23 @@
 #include <time.h>                   /* time              */
 #include <fcntl.h>                  /* open              */
 #include <unistd.h>                 /* close             */
+#include <sys/wait.h>

 #include "headers/message.h"        /* messaging in gpm */
 #include "headers/daemon.h"         /* daemon internals */
+#include "headers/xcap.h"

 void selection_paste(void)
 {
    char c=3;
    int fd;

+   /* XCaP start */
+   int i;
+   struct stat X0;
+   FILE *xclip;
+   /* XCaP start */
+
    if (!opt_aged && (0 != opt_age_limit) &&
       (last_selection_time + opt_age_limit < time(0))) {
       opt_aged = 1;
@@ -41,9 +49,30 @@ void selection_paste(void)
       return;
    }

+   /* XCaP start */
+   /* check Xwindow: if Xwindow not active - xclip freeze for 6 sec :( */
+   if (stat("/tmp/.X11-unix/X0", &X0) != -1) {
+      if (!(xclip=popen("/usr/local/bin/xclip -d :0 -o", "r")))
+          gpm_report(GPM_PR_OOPS,"open pipe");
+      /* read Xwindow clipboard into current selection */
+      if ((i = fread(sel_buffer, sizeof(char), SCR_SIZE-1, xclip)) > 0)
+          *(sel_buffer+(sel_buffer_lth=i)) = 0;
+      if (!WIFEXITED(pclose(xclip)))
+          gpm_report(GPM_PR_OOPS,"close pipe");
+   }
+   fd=open_console(O_WRONLY);
+   for(i=0; i<sel_buffer_lth; i++)
+      if (ioctl(fd,TIOCSTI,&sel_buffer[i]) < 0)
+          gpm_report(GPM_PR_OOPS,"TIOCSTI");
+   close(fd);
+   return;            /* never paste from kernel buffer */
+   /* XCaP end */
+
+/*
    fd=open_console(O_WRONLY);
    if(ioctl(fd, TIOCLINUX, &c) < 0)
       gpm_report(GPM_PR_OOPS,GPM_MESS_IOCTL_TIOCLINUX);
    close(fd);
+*/
 }

diff -rupN gpm-1.20.7-orig/src/headers/xcap.h gpm-1.20.7-xclip/src/headers/xcap.h
--- gpm-1.20.7-orig/src/headers/xcap.h  1970-01-01 12:00:00.000000000 +1200
+++ gpm-1.20.7-xclip/src/headers/xcap.h 2014-07-29 13:40:53.619799026 +1200
@@ -0,0 +1,14 @@
+/*
+ * Xwindow Copy&Paste patch
+ * (c) 2002 Alex Efros <powerman@asdfGroup.com>
+ */
+
+#define SCR_SIZE 10240 /* current console image, for 80x25 needed only 2000 */
+
+#include <asm/types.h> /* __u32 */
+__u32 inwordLut[8];    /* used in gpn.c and gpm.c */
+
+char *sel_buffer;      /* buffer with current selection */
+int sel_buffer_lth;    /* size of buffer with current selection */
+
+
diff -rupN gpm-1.20.7-orig/src/prog/display-buttons.c gpm-1.20.7-xclip/src/prog/display-buttons.c
--- gpm-1.20.7-orig/src/prog/display-buttons.c  2012-10-27 10:21:38.000000000 +1300
+++ gpm-1.20.7-xclip/src/prog/display-buttons.c 2014-07-29 13:41:00.881822332 +1200
@@ -36,7 +36,7 @@
 #include <stdio.h>            /* printf()             */
 #include <time.h>             /* time()               */
 #include <errno.h>            /* errno                */
-#include <gpm.h>              /* gpm information      */
+#include <headers/gpm.h>              /* gpm information      */

 /* display resulting data */
 int display_data(Gpm_Event *event, void *data)

再起動後に起動するように構成する

/etc/rc.local

# Support for a shared clipboard
(/usr/bin/Xvfb :0 >/dev/null 2>&1) &
sleep 1
DISPLAY=:0 /bin/VBoxClient --clipboard
/usr/local/bin/xclip-gpm -m /dev/input/mice -t exps2


2

WindowsクリップボードのコンテンツをゲストLinuxに取り込む方法を見つけました。他の誰かが便利だと思った場合に備えてここで共有します。

  • まず、非常に便利なインストールClipXを(私はラッキーだった中、私はそれが既にインストールしていたとしていたということだけで私は、このコピー&ペーストの問題に出くわしたときに、他の理由でそのプラグインのリストを閲覧して。)

  • ClipX DiskLog Plugin 1.2同じページからもインストールします

  • システムトレイのClipXアイコンを右クリックしてConfigure、ファイルの場所を選択します(注:このファイルはすべてのクリップボードのコンテンツを保存し、プライベートな場所を選択し、定期的にクリアします)。D:\Personal\clipboard\clip.txt

  • Linuxゲストで、Virtualbox Guestの追加機能をインストールします(他の場所で利用可能な指示、インストールX中の関連エラーは無視してください。必要な「共有フォルダー」機能は引き続き機能します)

  • Virtualboxに移動しDevices->Shared Folders、上記のフォルダD:\Personal\clipboard\を追加して名前を付けますclipboard(この時点で手動でドライブをマウントする場合を除き、続行する前にゲストを再起動することをお勧めします)

  • ここで.bashrc(または必要に.bash_aliases応じて)エイリアスを作成します

    alias winclip='tail -n 1 /media/sf_clipboard/clip.txt'
    
  • コマンドラインで現在のWindowsクリップボードの内容を使用する場合は$(winclip)、その時点で使用します

これは多くの手順のように見えますが、数分で完了し、VMサーバーとPuttyクライアントを実行sshしてこの単純な機能を実行する手間を回避できます。しかし、双方向にする方法を見つけていませんが、提案を歓迎します!


1

これは、Gnomeデスクトップ環境なしでインストールしたDebian 7.4.0サーバーの双方向クリップボードサポートを有効にする方法です。VirtualBox 4.3.6を使用しています。

Xサーバーをインストールして起動します。

apt-get install x-window-system-core && startx

クリップボードサポート用にxclipをインストールする

apt-get install xclip

Virtualboxがゲスト追加を構築できるようにツールをインストールする

apt-get install bzip2 build-essential linux-headers-`uname -r`

ゲスト追加イメージをマウントし、追加をインストールします

mount /dev/cdrom /mnt && bash /mnt/VBoxLinuxAdditions.run

最後にでdebianを再起動しshutdown -r nowます。

ここにゲスト追加をインストールするための指示を得ました。このブログエントリは、xclipのカスタマイズに役立ちます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.