====== 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/
* 调试九法