获取当前shell脚本所在的路径(目录), 支持软链接.
DIR=`S=\`readlink "$0"\`; [ -z "$S" ] && S=$0; dirname $S`
获取当前shell脚本所在的路径(目录), 支持软链接.
DIR=`S=\`readlink "$0"\`; [ -z "$S" ] && S=$0; dirname $S`
iftop -n -N -B -i eth1 -t -P
-n
不要反查主机名dns-N
不要将端口解析为文字描述-B
显示流量单位为字节, 而不是位-i
指定网卡-t
不要显示为字符窗口形式(类似top命令), 而是滚动输出-P
按端口统计mtr 查看网络丢包率
mtr 8.8.8.8
业务场景:
* server A 经常需要使用rsync将文件同步至 server B
* rsyncd 的配置稍显复杂,不想在 server B 上配置rsyncd
* 出于安全性的考虑,不能完全开放 server A 至 server B 的ssh权限
解决方案:
配置server B上的~/.ssh/authorized_keys, 允许server A使用ssh连接至server B, 但是限制只能使用rsync命令,并且限制rsync上传的目录
在server A上创建用于专门用于rsync验证的ssh密钥
ssh-keygen -C rsync_key -f ./rsync_key -P '' -N '' #or ssh-keygen -t rsa
在server B下载 rrsync 存放至 $HOME/bin/rrsync
在server B的~/.ssh/authorized_keys中加入以下内容,行尾的部分即是第一步生成的rsync_key.pub的内容:
command="$HOME/bin/rrsync /data/work/package/",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding ssh-rsa AAAA**content of rsync_key** rsync_key
在server A上可以通过下面的rsync命令把local_name上传至server B的/data/work/package/remote_name来传输文件:
rsync -av -e 'ssh -o StrictHostKeyChecking=no -i /path/to/rsync_key' local_name user@serverB:remote_name
参考链接:Restricting SSH Access to rsync
转自: http://oylb.in/blog/2015/09/01/restrict-rsync-with-authorized-keys/
原标题: 使用authorized_keys限制rsync
创建用户:
GRANT REPLICATION SLAVE ON *.* TO 'userx'@'server_b' IDENTIFIED BY 'xxxxx';
导出数据:
mysqldump --all-databases --master-data > dbdump.sql
导致的 dbdump.sql 里会包含 binlog 的位置.
CHANGE MASTER TO MASTER_HOST='server_a'; CHANGE MASTER TO MASTER_USER='userx'; CHANGE MASTER TO MASTER_PASSWORD='xxxxx'; CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=106; start slave; show slave status\G
很多C/C++程序虽然在做网络编程, 但大多用别人封装好的库, 对底层不甚了解, 感觉 IO 操作不是很简单吗? 我敢说, 大多数人进行 IO 的姿势都不对, 所谓的 IO, 主要是 read()/write() 两个函数.
先说错误的 IO 读操作:
int ret = read(fd, buf, len); if(ret == -1){ exit(-1); }else if(ret == 0){ close(fd); }
看起来好像很正确的样子, 返回值也判断了, 不仅判断 -1, 还判断 0, 应该姿势正确吧? 错! 完全错误! 因为你忽略了 errno 的处理. 仔细看文档, 函数返回 -1 不能完全代表 fd 错误, 还需要结合 errno.
接下来这样改:
int ret = read(fd, buf, len); if(ret == -1){ if(errno == EINTR){ // 怎么办? }else if(errno == EAGAIN){ // 怎么办? } exit(-1); }else if(ret == 0){ close(fd); }
EINTR 表示 read() 函数调用被系统中断了, 调用者和 fd 都没有问题, 有问题的是操作系统. 而 EAGAIN 是在非阻塞 IO 时会出现. 上面的代码判断了 errno, 但不知道下一步该怎么做, 还不行.
在 Linux 下进行 IO 操作的正确姿势是:
while(1){ int ret = read(fd, buf, len); if(ret == -1){ if(errno == EINTR){ continue; }else if(errno == EAGAIN){ // 根据你和调用者的约定, 返回一个数值告诉它再次重试 // 一般是结合 select/epoll 等 IO 多路复用函数 } exit(-1); }else if(ret == 0){ close(fd); } // proc break; }
没错, 在 read() 外面包一个 while(1). 以后你看到有谁写的 read() 代码不是被包含在一个死循环里, 你就可以下结论说这段代码不完善.
写 IO 的 write() 函数也是类似用法. 建议有心人可以参考 sim 框架的代码, 看看别人是怎么做的, 程序员应该多造轮子, 但不要关起门来造车.
最近比较奇怪, 发现家目录下多了一个名为 sent 的文件, 不断增大体积. 看了一下, 里面的内容都是邮件.
最后才发现原来是 mutt 客户端. 只需要生成一个 .muttrc, 填写相应配置即可:
# ~/.muttrc set copy=no