ভার্চুয়ালবক্স ব্যবহার করে আমার একটি উইন্ডোজ 7 হোস্টে ডেবিয়ান অতিথি ইনস্টল আছে। ইনস্টলেশনটিতে ডিফল্টরূপে ভার্চুয়ালবক্স-ওস-গেস্ট-ইউটিস অন্তর্ভুক্ত ছিল, তাই আমার যা যা প্রয়োজন তা আমার উচিত। আমি কীভাবে ভাগ করা ক্লিপবোর্ডটি চালু করতে পারি?
ভার্চুয়ালবক্স ব্যবহার করে আমার একটি উইন্ডোজ 7 হোস্টে ডেবিয়ান অতিথি ইনস্টল আছে। ইনস্টলেশনটিতে ডিফল্টরূপে ভার্চুয়ালবক্স-ওস-গেস্ট-ইউটিস অন্তর্ভুক্ত ছিল, তাই আমার যা যা প্রয়োজন তা আমার উচিত। আমি কীভাবে ভাগ করা ক্লিপবোর্ডটি চালু করতে পারি?
উত্তর:
আমি আশঙ্কা করছি যে আপনার কাছে কেবল কমান্ড-লাইনের অতিথির ভাগ করা ক্লিপবোর্ড থাকতে পারে না।
এটি কারণ টিটিওয়াই প্রকৃতপক্ষে কোনও সঠিক ক্লিপবোর্ড তৈরি করে না যা অতিথি সংযোজনগুলি ব্যবহার করতে পারে, তার জন্য আপনার একটি সম্পূর্ণ জিইউআই প্রয়োজন।
হোস্টের থেকে অতিথিতে লগ ইন করতে আপনি এসএসএইচ ব্যবহার করা ভাল। ক্লিপবোর্ডটি ভাগ করতে আপনি এইভাবে আপনার এসএসএইচ ক্লায়েন্টের বৈশিষ্ট্যগুলি ব্যবহার করতে পারেন যেমন পুট্টি।
এটি করা যেতে পারে। আমি নিম্নলিখিতগুলির সাথে দ্বিপক্ষীয় কাজ পেতে সক্ষম হইনি, তবে হোস্ট টু গেস্ট (যেমন টেক্সট কনসোলে কন্টেন্ট আটকানো) কাজ করে। নিম্নলিখিত নির্দেশাবলী CentOS 5/6/7 এর জন্য, তবে তাদের অনুরূপ প্রক্রিয়া অন্যান্য স্বাদের জন্য কাজ করা উচিত।
এটি এক্স 11 ক্লিপবোর্ডকে জিপিএম ক্লিপবোর্ডের সাথে সিঙ্ক করে রাখবে। যখন ভাগ করা ক্লিপবোর্ড সেটিংসটি "অতিথির উদ্দেশ্যে অতিথি" জন্য কনফিগার করা হবে তখন হোস্ট ক্লিপবোর্ড পরিবর্তিত হলে ভার্চুয়ালবক্স এক্স 11 ক্লিপবোর্ড আপডেট করবে ... প্যাচড জিপিএম তখন জিপিএম ক্লিপবোর্ডে এক্স 11 ক্লিপবোর্ডের ডেটা টানতে এক্সক্লিপ ব্যবহার করবে ... যা এর পরে আটকানো যাবে মাঝের মাউস বোতাম
সার্ভার / কনসোল মোডে কাজ করতে ক্লিপবোর্ড ভাগ করে নেওয়া "হোস্ট টু গেস্ট" পাওয়া সম্ভব। "গেস্ট টু হোস্ট" ভাগ করে নেওয়া এই মুহুর্তে কাজ করছে না, সম্ভবত VBoxClient এবং Xvfb এর মধ্যে সমস্যার কারণে।
yum Xvfb ইনস্টল করুন
মাউন্ট / ডেভ / সিডিরাম / এমএনটি /mnt/VBoxLinuxAdditions.run
ডাউনলোড করুন, সংকলন এবং ইনস্টল করুন xclip ( http://sourceforge.net/projects/xclip/ ) হিসাবে / usr / স্থানীয় / বিন / এক্সক্লিপ।
সর্বশেষতম জিপিএম উত্সটি ডাউনলোড করুন এবং নিম্নলিখিত পরিবর্তনগুলির সাথে এটি প্যাচ করুন।
বাইনারি / ইউএসআর / লোকাল / বিন / এক্সক্লিপ-জিপিএম হিসাবে ইনস্টল করুন।
এটি অ্যালেক্স ইফ্রোসের একটি প্যাচের একটি আপডেট সংস্করণ ( http://powerman.name/patch/gpm.html )।
ডিস-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
এটি এখনও কার্যকর করা হয়নি, ইতিমধ্যে 6 বছরের পুরানো এই অসামান্য বৈশিষ্ট্য অনুরোধটি দেখুন।
আমি উইন্ডোজ ক্লিপবোর্ডের সামগ্রীটি অতিথি লিনাক্সে পাওয়ার একটি রাউন্ডআউব উপায় পেয়েছি, অন্য কেউ যদি এটির কাজে লাগে সে ক্ষেত্রে এটি ভাগ করে নেওয়ার জন্য:
প্রথমে অবিশ্বাস্যভাবে কার্যকর ক্লিপএক্স ইনস্টল করুন (আমি ভাগ্যবান যে আমি এটি ইতিমধ্যে ইনস্টল করেছিলাম এবং আমি যখন এই অনুলিপি-পেস্ট সমস্যাটি এসেছিলাম তখন অন্যান্য কারণে স্রেফ তার প্লাগইন তালিকার মাধ্যমে ব্রাউজ করে আসছি।)
ClipX DiskLog Plugin 1.2
একই পৃষ্ঠা থেকে ইনস্টল করুন
সিস্টেম ট্রেতে ক্লিপএক্স আইকনটিতে ডান ক্লিক করুন, Configure
এবং ফাইলের জন্য একটি অবস্থান চয়ন করুন (দ্রষ্টব্য: এই ফাইলটি আপনার সমস্ত ক্লিপবোর্ডের সামগ্রী সংরক্ষণ করবে, একটি ব্যক্তিগত অবস্থান চয়ন করবে এবং / অথবা এটি নিয়মিত সাফ করবে), আসুন বলিD:\Personal\clipboard\clip.txt
আপনার লিনাক্স অতিথিতে ভার্চুয়ালবক্স অতিথি সংযোজনগুলি ইনস্টল করুন (অন্য কোথাও উপলভ্য নির্দেশাবলী এবং X
ইনস্টলেশন চলাকালীন যে কোনও সম্পর্কিত ত্রুটি উপেক্ষা করুন , প্রয়োজনীয় "ভাগ করা ফোল্ডার" বৈশিষ্ট্যটি এখনও কাজ করবে)
আপনার ভার্চুয়ালবক্সে যান Devices->Shared Folders
, উপরের ফোল্ডারটি যুক্ত করুন D:\Personal\clipboard\
এবং একটি নাম দিন, বলুন clipboard
(আপনি যদি এই মুহুর্তে ড্রাইভটি ম্যানুয়ালি মাউন্ট করতে না চান তবে আপনি চালিয়ে যাওয়ার আগে অতিথি পুনরায় আরম্ভ করতে ইচ্ছুক হতে পারেন)
এখন আপনার .bashrc
(বা .bash_aliases
আপনি যদি চান) একটি উপন্যাস তৈরি করুন যা বলবে
alias winclip='tail -n 1 /media/sf_clipboard/clip.txt'
আপনি যখনই কমান্ড লাইনে বর্তমান উইন্ডোজ ক্লিপবোর্ড সামগ্রীগুলি ব্যবহার করতে চান, ঠিক $(winclip)
সেই মুহূর্তে ব্যবহার করুন
এটি দেখতে অনেক ধাপের মতো, তবে এটি কেবল কয়েক মিনিট সময় নেয় এবং ভিএম সার্ভার এবং পুট্টি ক্লায়েন্ট চালিয়ে ssh
যাওয়া এবং এই সাধারণ বৈশিষ্ট্যের জন্য প্রবেশ করার ঝামেলা এড়ায় । এটিকে দ্বিদর্শী করার কোনও উপায় আমি পাইনি, পরামর্শগুলি স্বাগত!
এইভাবে আমি জিনোম ডেস্কটপ পরিবেশ ছাড়াই ইনস্টল করা আমার ডেবিয়ান 7.4.0 সার্ভারের জন্য দ্বি-নির্দেশমূলক ক্লিপবোর্ড সমর্থন সক্ষম করেছিলাম। আমি ভার্চুয়ালবক্স ৪.৩..6 ব্যবহার করছি।
এক্স সার্ভারটি ইনস্টল করুন এবং শুরু করুন:
apt-get install x-window-system-core && startx
ক্লিপবোর্ড সহায়তার জন্য এক্সক্লিপ ইনস্টল করুন
apt-get install xclip
সরঞ্জামগুলি ইনস্টল করুন যাতে ভার্চুয়ালবক্স অতিথি সংযোজনগুলি তৈরি করতে পারে
apt-get install bzip2 build-essential linux-headers-`uname -r`
অতিথি সংযোজন চিত্রটি মাউন্ট করুন এবং সংযোজনগুলি ইনস্টল করুন
mount /dev/cdrom /mnt && bash /mnt/VBoxLinuxAdditions.run
অবশেষে ডিবিয়ান পুনরায় আরম্ভ করুন shutdown -r now
।
আমি এখানে অতিথি সংযোজন ইনস্টল করার জন্য নির্দেশাবলী পেয়েছি । এই ব্লগ এন্ট্রি এক্সক্লিপ কাস্টমাইজ করার জন্য দরকারী।