====== Copy and Paste ====== This page is used for copy and paste sharing. slmgr /skms s1.kms.cx slmgr /ipk FJ82H-XT6CR-J8D7P-XQJJ2-GPDD4 slmgr /ato slmgr /xpr pause ===== Guacamole部署 ===== 转到guacamole #guacamole测试的docker,效果尚佳 docker run -p 6080:80 -p 5900:5900 -e VNC_PASSWORD=111222333 -v /dev/shm:/dev/shm --rm dorowu/ubuntu-desktop-lxde-vnc docker run -p 8080:8080 --rm flcontainers/guacamole guacamole部署 docker run --name mysql --rm -e MYSQL_ROOT_PASSWORD=123456 \ -p 3306:3306 -v $HOME/mysql-data:/var/lib/mysql mysql:8 #-e MYSQL_ALLOW_EMPTY_PASSWORD=yes docker run --rm guacamole/guacamole /opt/guacamole/bin/initdb.sh --mysql > initdb.sql mysql -h localhost -u root --protocol tcp > CREATE DATABASE guacamole_db; > quit cat initdb.sql | mysql -h localhost -u root --protocol tcp guacamole_db docker run --rm --name guacamole \ -e GUACD_HOSTNAME=192.168.3.125 \ -e GUACD_PORT=4822 \ -e MYSQL_HOSTNAME=192.168.3.125 \ -e MYSQL_DATABASE=guacamole_db \ -e MYSQL_USER=root \ -e MYSQL_PASSWORD=123456 \ -p 8080:8080 guacamole/guacamole Guacamole debug ./src/guacd/guacd -f -L trace -b 0.0.0.0 ===== IPv6 Multicast ===== 组播与单播的区别(从应用层角度看): * 发送方发送的目的地址不是接收方的IP地址,而是**从**某link,**向**link上某组播地址的一个组,发送数据。 * 接收方Bind的不是**接口的地址**+端口概念,而是Bind**接口**+端口,并从这个接口加入某组播地址的group。接收方在接收组播消息的接口上的本地地址,在应用层看来是无关紧要的。 综上,组播调用时有以下不同: * 发送socket,发送前需要额外指定**发送组播消息的端口**,之后将组播地址与端口正常填入sockaddr_in6 * 接收socket,接收前常规bind,但只有加入ipv6_mreq指定的组后才会收到该组播地址的消息。ipv6_mreq中指定了一个组播地址与其所在的interface。 但,自己发送组播消息,自己接收时需要额外两步支持Loop: * IPV6_MULTICAST_HOPS, 指定最大hops * IPV6_MULTICAST_LOOP, 开启LOOP支持 Tips,使用'''ip link'''查看接口的ifindex。 样例代码 //send m_udpSocketSend.UseIpv6Mode(1); m_udpSocketSend.Create(); m_udpSocketSend.SetBlocking(0); //像常规地址一样将组播地址与端口填入目的sockaddr_in6 m_udpSocketSend.SetDestIpAndPort(m_Settings.GetSendRemoteMaddrV6Str(),m_Settings.GetSendRemotePortV6()); //指定目的组播地址所在的interface int ifindex = m_Settings.GetIfIndex(); if (setsockopt(m_udpSocketSend.m_sock_fd, IPPROTO_IPV6, IPV6_MULTICAST_IF, &ifindex, sizeof(ifindex)) < 0) { return ERROR; } #if SVW_MULTICAST_SUPPORT_LOOP int hops = 255; if(setsockopt(m_udpSocketSend.m_sock_fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &hops, sizeof(hops)) < 0) { LOGI("set send Socket IPV6_MULTICAST_HOPS failed."); perror("setsockopt"); } if(setsockopt(m_udpSocketSend.m_sock_fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &on, sizeof(on)) < 0) { LOGI("set send Socket IPV6_MULTICAST_LOOP failed."); perror("setsockopt"); } #endif //发送!! m_udpSocketSend.SendMsg(&sendbuff); //receive m_udpSocketReceive.UseIpv6Mode(1); m_udpSocketReceive.Create(); m_udpSocketReceive.SetBlocking(0); if(!m_udpSocketReceive.Bind(m_Settings.GetReceivePortV6())) { return ERROR; } //join multicast group struct ipv6_mreq mGroupAddr; crt_memset(&mGroupAddr,0,sizeof(mGroupAddr)); if(!crt_inet_addr_v6(m_Settings.GetReceiveMaddrV6Str(),&mGroupAddr.ipv6mr_multiaddr)) { LOGI("invalidate v6 ip %s\n", m_Settings.GetReceiveMaddrV6Str()); return ERROR; } if(m_Settings.GetIfIndex() != 0) { mGroupAddr.ipv6mr_interface = m_Settings.GetIfIndex(); } if (setsockopt(m_udpSocketReceive.m_sock_fd, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, &mGroupAddr, sizeof(mGroupAddr)) < 0) { LOGE("setting join MULTICAST group %s failed.",m_Settings.GetReceiveMaddrV6Str()); return ERROR; } ===== rsync ===== #rsync推荐样例: rsync -avIPhz \ --exclude='update-backups/*' \ --backup-dir=update-backups/`date '+%Y%m%d-%H%m'`/ \ ~/cv-release/ root@remote.site:/path/to/release/ cat >help.txt< ==== Ignore me ==== * https://jx.jsonplayer.com/player/?url=https://v.qq.com/x/cover/mzc00200ct230h1/j00464box2d.html * https://yangtu.top/ * www.lixianla.com * https://pan.baidu.com/share/init?surl=4uEZTpBWlBI2lvejtZjj1g&pwd=62ph * [[http://ipv6.www.dddns.icu/74d62d82a9/u1000/pt/The.Pig.the.Snake.and.the.Pigeon.2023.1080p.NF.WEB-DL.DDP5.1.H264-HHWEB/The.Pig.the.Snake.and.the.Pigeon.2023.1080p.NF.WEB-DL.DDP5.1.H264-HHWEB.mkv|The.Pig.the.Snake.and.the.Pigeon.2023.1080p]] * https://www.bilibili.com/video/BV1XN4y187zp * https://www.bilibili.com/video/BV1Xx4y1V7JZ/ * 调试九法