Linux/Mac 的一些初学笔记

此文本是我在初学使用Linux/Mac时的一些笔记,整理放在一起,便于遗忘时快速查阅定位。

Zsh 使用笔记

  1. 命令选项补全。 在zsh中只需要键入 tar - 就会列出所有的选项和帮助说明
  2. 目录浏览和跳转:输入 d,即可列出你在这个会话里访问的目录列表,输入列表前的序号,即可直接跳转。
  3. 智能跳转,安装了 autojump 后并启用之,zsh 会自动记录你访问过的目录,通过 j 目录名 可以直接进行目录跳转,而且目录名支持模糊匹配和自动补全,例如你访问过 hadoop-1.0.0 目录,输入j hado 即可正确跳转。j –stat 可以看你的历史路径库。
  4. 在命令行中输入 alias 可以查看所有的命令别名
  5. 在用户根目录的 .zshrc 中新增函数方法动作、快捷别名

参考小土刀的文章:zsh 全程指南 | 小土刀

Mac OS 如何在终端下打开 APP 应用程序?

比如使用 x.app 软件 打开 y.txt 文件,可使用open命令

open -a x.app y.txt

如何启动HTTP代理 Privoxy ?

因没有安装在系统目录内,所以启动的时候需要打全路径。

sudo /usr/local/sbin/privoxy /usr/local/etc/privoxy/config

查看是否启动成功

netstat -na | grep 8118

如何查找一个文件,并返回路径?

# 查找文件 `name.txt` 路径
find / -name "name.txt"

# `/` 表示全局查找,替换它以便在其他指定目录查找。

如何创建一个快捷访问文件?

# ln -s 源目录 目标快捷方式
# 例如:在当前文件下创建快捷文件 wwwroot,并指向目录 /home/wwwroot/
ln -s /home/wwwroot/ wwwroot

如何离线下载 YouTube 视频?

答:使用强大的youtube-dl吧,项目源码:https://github.com/rg3/youtube-dl

安装 youtube-dl:

pip install --upgrade youtube_dl

使用方法:

# https://www.youtube.com/watch?v=nNGmruHS3r8 => 需要下载的视频URL
# 执行下列命令缓存到当前目录
youtube-dl https://www.youtube.com/watch?v=nNGmruHS3r8

离线取回:

# 利用 python 即可快速创建一个临时 WEB 服务,当其他 Node 的 http-sever 也可以的。
python -m SimpleHTTPServer 8080

现在要下载一个视频 MP3 轨道,我们需要以下两个选项:

  1. –extract-audio (短选项-x) -视频文件转换为纯音频文件。
  2. –audio-format -指定音频格式,其中该文件将被下载。 支持的音频格式是“最佳”,“aac”,“vorbis”,“mp3”,“m4a”,“opus”或“wav” “best”默认设置

要将视频下载为mp3文件,可以使用以下命令之一:

youtube-dl -x --audio-format mp3 https://www.youtube.com/watch?v=jwD4AEVBL6Q

那么如果我们已经下载了视频格式,结果还想要音频MP3呢?
答:可以使用 ffmpeg 格式转换工具

# 以下命令可以将 123.mp4 文件转换成 123.mp3 文件
ffmpeg -i 123.mp4 123.mp3

如何打包、压缩、解压文件/文件夹呢?

.tar.gz格式(.tar是打包! .gz是压缩!打包后的文件名:FileName;需要打包的文件夹:DirName)

# 压缩:
$ tar zcvf FileName.tar.gz DirName
# 解压:
$ tar zxvf FileName.tar.gz

.zip格式(打包文件file1、file2和目录dir,压缩为file.zip)

# 解压:
$ unzip file.zip
# 压缩:
$ zip -r file.zip file1 file2 dir

如何复制一个文件夹下的文件到另一个文件夹里?

需求:dir1目录下面的一堆文件复制到dir2目录下。

cp -r dir1  dir2  # 这样的话dir1文件夹复制到了dir2下 
cp -r dir1/. dir2 # 加上 /. 既可

如何上传和下载一个文件?

答:可以使用 Curl、Wget、rz/sz、scp 工具

  1. Wget 是大多数 *nix 系统中标准的命令行下载工具。

    $ Wget https://example.com/download.php?fileID=foo
  2. Mac OS 自带 Curl 下载 Chrome 的例子:

    # 正常下载一个文件
    $ curl -O https://dl.google.com/chrome/mac/stable/GGRO/googlechrome.dmg
    # url 重定向链接
    $ curl -L -o 'file.zip' 'https://example.com/download.php?fileID=foo'
    # 上传文件到远程ftp
    $ curl -T file.zip ftp://root:123456@jandou.com/home/wwwroot/
    # 上传文件到远程sftp:
    $ curl -T file.tar.gz -u root sftp://jandou.com
  3. rz/sz 命令

  4. 远程拷贝和本地上传 scp 命令
    # 从远程机器拷贝到本地  ( -P: 大写的P, 指定端口号 )
    $ scp -P 10086 root@bg.jandou.com:/root/file.zip ~/Desktop
    # 从本地上传到远程机器(-r:小写的r,表示递归,目录或文件只能用相对路径)
    $ scp -P 10086 -r ~/Desktop/file.zip root@bg.jandou.com:/root/

出现错误***: not a regular file不能成功传送,解决方案:有可能服务器没权限 chmod 777 ,在使用scp时加上 -r 参数即可

VI/VIM 常用命令列表

:w 保存文件但不退出vi
:w file 将修改另外保存到file中,不退出vi
:w! 强制保存,不推出vi
:wq 保存文件并退出vi
:wq! 强制保存文件,并退出vi
:q 不保存文件,退出vi
:q! 不保存文件,强制退出vi
:e! 放弃所有修改,从上次保存文件开始再编辑
i 进入编辑模式
d 非编辑模式,双击 d ,删除整行

网卡物理地址(Mac地址)如何动态设置?

例如 00:1f:3c:93:b5:99,可执行:

$ sudo ifconfig en1 ether 00:1f:3c:93:b5:99

如何进行文件(夹)的删除操作?

  • 删除空目录dir: rmdir dir
  • 删除非空目录dir: rm -rf dir

如何进行文件(夹)的重命名操作?

  • 删除空目录dir: mv 原XXX.mp3 改XXX.mp3

Linux 里的进程守护有哪些方法?

  1. screen 进程守护,来源 http://www.cmsky.com/shadowsocks-manyuser-sspanel/

    screen -S ss
    cd /root/shadowsocks/shadowsocks/
    python servers.py

    恢复执行:

    screen -r ss
  2. supervisor 进程守护

    • 首先安装 supervisor

      默认安装了 pip , 如果没安装过,不同平台参考下面命令安装:

      $ sudo apt-get install python-pip  # For Debian/Ubuntu
      $ sudo yum install python-pip # For CentOS

      安装 supervisor 命令:

      $ pip install supervisor
    • 创建 supervisor 配置文件

      # 输出至 supervisor 的默认配置路径。
      # 我没有放在默认位置,我放在 /root/shadowsocks 文件夹里的!
      $ echo_supervisord_conf > /etc/supervisord.conf
    • 在 supervisord.conf 所放目录下运行 supervisor 服务

      # $ [root@zhuziyi shadowsocks]# supervisord
      $ supervisord
    • vim 配置 supervisor 以监控 ss-manyuser 运行(或者vi命令)

      $ vim /etc/supervisord.conf
    • 在文件尾部(当然也可以新建配置文件,不过这样比较方便)添加如下内容并酌情修改:

      [program:ss-manyuser]
      command = python /root/shadowsocks-rm/shadowsocks/servers.py
      user = root
      autostart = true
      autorestart = true

      其中 command 里的目录请自行修改为你的 servers.py 所在的绝对路径。

    • 重启 supervisor 服务以加载配置

      $ killall -HUP supervisord
    • 查看 shadowsocks-manyuser 是否已经运行:

      $ ps -ef | grep servers.py
    • 可以通过以下命令管理 shadowsock-manyuser 的状态

      $ supervisorctl {start|stop|restart} ss-manyuser

      参考:https://prinzeugen.net/build-shadowsocks-sharing-site-with-ss-panel/

  3. 在命令后面加上一个 & 符号,表示该命令放在后台执行

    • fg(foreground)命令:将后台进程 调到前台
    • bg(background)命令:将一个在后台暂停运行的命令,变成继续在后台执行的命令。
    • Ctrl + Z 命令:将一个正在前台执行的命令放到后台,并且暂停
    • Ctrl + C 命名:结束前台进程
    • 用jobs查看进程的 jobnumber,然后用命令:kill %n 来结束。
    • 用 PS 查看进程的 pid,然后用命令:kill pid 来结束。
  4. 强大的 PM2 进程管理(推荐)

    • 启动 Shadowsocks:pm2 start /root/shadowsocks/servers.py –name=”shadowsocks” –watch
    • 启动 Http-Server:pm2 start http-server –name=”node-server” –watch

进程守护全面参考:http://www.ruanyifeng.com/blog/2016/02/linux-daemon.html

Mac Terminal里的一些杂项记录

sudo killall -9 networkd
ifconfig 查看网络配置
telnet 172.25.47.49 11443 检测服务器 172.25.47.4911443 端口是否开启
lsof -i tcp:8090 -n 查看8090端口使用情况
ssh -D 6088 supdev@172.25.47.49 连接 172.25.47.49 服务器,本地 6088 端口数据 Socks 5 代理到服务器网络

如何安装 Google BBR 脚本为服务器加速?

  1. https://teddysun.com/489.html
  2. https://doub.io/wlzy-22/
  3. 逗比一键安装SSR教程:https://doub.io/ss-jc42/comment-page-5/

注意! Centos 7 默认开启自带防火墙,如果不关闭,系统重启后,外网是无法访问机器的。

如何安装小众加密代理 Brook ?

脚本地址:https://softs.fun/Bash/brook.sh
脚本说明:https://doub.io/brook-jc3/
客户端:https://doub.io/brook-jc2

如何使用 Screen 进程守护?简版

  1. 新建一个Screen,如开启一个ss进程守护: screen -S ss
  2. 开启需要长期运行的进程,如开启一个Node HTTP服务:http-server -p 80
  3. 将当前Screen Session放到后台:CTRL + A + D
  4. 当需要唤起一个Screen Session 时:screen -r ss
  5. 终止一个Screen Session:先exit退出,再 CTRL + D

via:https://github.com/chenzhiwei/linux/tree/master/screen

lnmp 如何安装和配置 SSL?

  1. 不能批量增加域名,会只生成一个路径,从而导致其他域名找不到证书
  2. 默认证书储存路径:/etc/letsencrypt/live
  3. nginx 的 80 端口强制 301 跳转到 443 端口、错误页、HSTS等设置,配置所在路径: /usr/local/nginx/conf/vhost/
    # 这是一个模板示例
    server
    {
    listen 80;
    server_name jandou.com;
    charset utf-8;
    return 301 https://$host$request_uri; # 注意进行301重定向到https,否则通过http仍能访问你的站点
    }
    server
    {
    listen 443 ssl http2;
    #listen [::]:443 ssl http2;
    server_name jandou.com ;
    index index.html index.htm index.php default.html default.htm default.php;
    root /home/wwwroot/default;
    ssl on;
    ssl_certificate /etc/letsencrypt/live/jandou.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/jandou.com/privkey.pem;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
    ssl_session_cache builtin:1000 shared:SSL:10m;
    # openssl dhparam -out /usr/local/nginx/conf/ssl/dhparam.pem 2048
    ssl_dhparam /usr/local/nginx/conf/ssl/dhparam.pem;

    # 严格传输安全(HSTS)配置
    add_header Strict-Transport-Security "max-age=63072000; preload";

    include none.conf;
    # 跳转到博客的 404 页
    error_page 404 $scheme://tech.jandou.com$request_uri;

    # Deny access to PHP files in specific directory
    #location ~ /(wp-content|uploads|wp-includes|images)/.*\.php$ { deny all; }

    include enable-php.conf;

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
    expires 30d;
    }

    location ~ .*\.(js|css)?$
    {
    expires 12h;
    }

    location ~ /.well-known {
    allow all;
    }

    location ~ /\.
    {
    deny all;
    }

    access_log off;
    }

简洁手动安装Let’sEncrypt HTTPS SSL证书更新步骤 (已废弃)

  1. 进入目录 /usr/local/nginx/conf/
  2. 将目录 vhost 修改成 【vhost-备份】
  3. 将目录 【vhost-https】修改成【vhost】
  4. 重启Nginx,执行 service nginx restart
  5. 进入root根目录执行 . ./renew_cert.sh 进行SSL更新下载
  6. 恢复vhost,并重启Nginx

详细用法请看之前写的文章:《为你的站点免费升级至 HTTPS 协议》

用LNMP套件后,如何删除 WEB 根目录中生成的.user.ini文件?

这个文件是防止误删网站根目录,且.user.ini权限被锁定,需要先解除锁定chattr -i .user.ini后删除该文件,才能删除网站根目录。

如何使用 crontab 来定时执行任务?

任务配置文件,在该文件里增加定时任务: /etc/crontab

  • service crond start //启动服务
  • service crond stop //关闭服务
  • service crond restart //重启服务
  • service crond reload //重新载入配置
  • service crond status //服务状态

我写的一个脚本示例,可下载:crontab.txt

#!/bin/bash

#随机数,表示随机一个 25 以内的数
randNum1=$(($RANDOM%25))
randNum2=$(($RANDOM%25))
currentTime=`date "+%Y-%m-%d %H:%M:%S"`

# /var/spool/cron/root ( root是个文件,代表 root 用户的任务调度 ),在文件夹 /var/spool/cron/ 存入各个用户的调度任务配置
# crontab -e 编辑某个用户的 cron 服务,比如当前用户为 root,这个命令实际上是个语法糖,最终还是往 /var/spool/cron/root 写入配置,效果一样!
path_root="/var/spool/cron/root"
# /etc/crontab 是系统任务调度,系统级别的任务添加在这里,但目前我没用这个!!
path_sys="/etc/crontab"
path_log="/root/wwwroot/jandou.com/data/runlog.txt"
path_qiandao="/root/wwwroot/jandou.com/data/qiandao.txt"

# 测试每分钟写入追加
# * * * * * echo \"$currentTime-$randNum1\" >> $path_log

#生成crontab 任务配置文件
echo "
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed

# 每 2 小时运行一次
* 2 * * * . /root/cache.sh

# 每60分钟执行一次
1 9-18 * * * node /root/house/app.js
" > $path_root

echo "# 每周 1 ~ 5 的 9:00 ~ 9:25 ,随机时间,执行一次
#####注释这一行暂停自动打卡
"$[randNum1]" 9 * * 1-5 node /root/qiandao/app.js" >> $path_root

echo "
# 每周 1 ~ 5 的 18:00 ~ 18:25 ,随机时间,执行一次
#####注释这一行暂停自动打卡
"$[randNum2]" 18 * * 1-5 node /root/qiandao/app.js" >> $path_root

echo "
# 每周日的 18:00 ,执行一次,清理签到日志
0 18 * * 7 echo '' > $path_qiandao" >> $path_root

echo "
# 每周 1 ~ 5 的 06:00,执行一次,用于自动生成 crontab 配置
#####注释这一行暂停自动打卡
0 6 * * 1-5 . /root/qiandao/timing.sh" >> $path_root

echo "
# crontab 配置文件生成时间:"$currentTime >> $path_root

echo "
① 生成 crontab 配置成功!" >> $path_log

#重启服务
service crond restart

echo "② 重启 crond 服务成功!
③ 当前时间:"$currentTime"
④ 上班时间:09 : "$randNum1"
③ 下班时间:18 : "$randNum2"
****************************" >> $path_log

cat $path_root

crontab 命令使用,定时执行任务,详细资料查看:http://www.cnblogs.com/peida/archive/2013/01/08/2850483.html

如何安装 zsh 搭档插件 autojump?

  1. Mac 上直接用 MacOS 缺失软件包管理器 Homebrew 来安装

    $ brew install autojump
  2. Centos 上可以用 Yum 安装

    $ yum install autojump
  3. 手动安装
    如果返回与以下提示,表示yum源没有autojump

    No package autojump available.
    Error: Nothing to do

    如果不想改源,那么就直接下载autojump源码手动安装:

    git clone git://github.com/joelthelion/autojump.git
    cd autojump
    install.py

    安装完后目录 ~/ 下面就有 .autojump 目录了,然后在 .zshrc 里面加一行:

    [[ -s ~/.autojump/etc/profile.d/autojump.sh ]] && . ~/.autojump/etc/profile.d/autojump.sh

    最后再执行一次 source .zshrc,以生效。

    OK!尽情享受!

资料

Linux 查询手册:http://linuxtools-rst.readthedocs.io/zh_CN/latest/

坚持原创技术分享,您的支持将鼓励我继续创作!