Linux指令拾遗

cmd指令修改自动/手动Ip

  1. 自动获取ip:
    1
    2
    netsh interface ip set address name="本地连接" source=dhcp
    netsh interface ip set dns name="本地连接" source=dhcp
  2. 手动获取ip:
    1
    netsh interface ip set address name="本地连接" source=static addr=192.168.2.5 mask=255.255.255.0 gateway=192.168.8.1 1

    kill gpu显存占用

  3. 查看占用进程
    fuser -v /dev/nvidia*
  4. 批量清除
    fuser -v /dev/nvidia* |awk '{for(i=1;i<=NF;i++)print "kill -9 " $i;}' | sh
  5. 快捷指令
    为实现快速批量kill 可以在.bashrc中配置了快速复制的指令,如下
    1
    2
    3
    4
    function killN {
    #echo "$1"
    fuser -v /dev/nvidia$1 |awk '{for(i=0;i<=NF;i++)print "kill -9 " $i;}'| sh
    }

批量kill满足条件的进程

ps -ef|grep xxx|grep -v grep|awk '{print $2}'|xargs kill -9
ps -ef查看所有进程ps -aux也是查看所有进程 不过两者右以下区别:
(1) -ef是System V展示风格,而-aux是BSD风格。
(2) COMMADN列如果过长,-aux会截断显示,而-ef不会
(3) -aux可以查看进程的CPU占用率和内存占用率,而-ef不能

grep xxx 过滤,只显示包含xxx的

grep -v grep 过滤掉包含grep的进程(当前这条指令的)
awk '{print $2}' 取按空格分割的第二个元素,这里正好是PID.
xargs kill -9xargs命令把前面命令的输出结果(PID)作为”kill -9”命令的参数,并执行

查看端口监听占用

netstat -nap |grep [端口号]

Linux断点续传(代替scp)

  1. 文件上传/下载
    1
    rsync -rP --rsh=ssh PATH username@hostname:PATH
  2. 文件夹上传/下载
    1
    rsync -P --port 2023 --rsh=ssh PATH username@hostname:PATH

新写法,还未实验
rsync -r -v --progress -e ssh user@remote-system:/address/to/remote/file /home/user/

Linux防网络不稳定远程链接(代替ssh)

安装网址mosh.org
链接指令

1
mosh username@password

查看GPU占用进程

fuser -v /dev/nvidia*

Mac终端Linux服务器看图

只支持Mac的Iterm2

在服务器端执行一下三条命令

1
2
3
curl "https://iterm2.com/utilities/imgcat" > imgcat
chmod +x imgcat
mv imgcat /usr/bin/

在Iterm2终端即可通过如下指令输出图片
1
imgcat xxx.png

Tmux

tmux是指通过一个终端登录远程主机并运行后,在其中可以开启多个控制台的终端复用软件。
之前也听说过tmux很好用,但程序一直采用nohup挂载,也不用担心终端关闭后无法继续。但在ipad上远程时,一直在想如何能多窗口,之前是利用软件自带的分屏如图所示。
但哪怕再挂个悬浮窗也就三个终端,而且还有遮挡

直到用了下tmux,真香

ipad上用到的ssh软件Terminus 搭配Kcode的sftp在线改代码,远程办公很棒。两个app都是免费的,其实Terminus上也有sftp只不过要花钱(而且还不是买断,是每年388),所以用Kcode


ipad上tmux切换窗口居然还是只能用快捷键,哪怕改了配置接了鼠标。。。

  1. 安装
    不同系统平台不一样自行百度
    redhat、centos 或 fedora:
    yum install tmux
    ubuntu:
    apt-get install tmux
    Mac
    brew install tmux
  2. 常用指令
    启动
    tmux new -s roc # roc是你这个tmux会话的名称,可以创建多个
    查看已有会话
    tmux ls
    进入已有会话
    tmux a -t roc
    一个会话创建新的窗口: ctrl+b 然后c
    关闭当前窗口: exit
    切换窗口: ctrl/control+b 序号[0,1,2…]
    退出当前会话: ctrl/control+b d
    左右分屏: ctrl/control+b %
    上下分屏: ctrl/control+b “
    切换分屏窗口: ctrl/control+b 方向键
  3. 配置优化
    可以自定义tmux的快捷键,比如他的激活指令ctrl+b可以改成别的,这里给出我的一些优化配置
    vim ~/.tmux.conf # 第一次可能啥都没有就新建一个

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # --------------------------------------------------- 更改新增面板键 -------------------------------------------------
    unbind %
    bind | split-window -h # 使用-屏,方便分屏 # 水平方向新增面板,默认进入当前目录
    unbind '"'
    bind - split-window -v # 使用|屏,方便分屏 # 垂直方向新增面板,默认进入当前目录

    # --------------------------------------------------- 开启鼠标支持 -----------------------------------------------------------
    # v2.1及以上的版本
    set-option -g mouse on

    输入下面指令让配置生效
    tmux source .tmux.conf

  4. 复制
    tmux复制采用vim的指令方式比较麻烦,这里首先在配置文件中输入下面代码

    1
    bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "xclip -in -selection clipboard"

    然后生效
    tmux中复制方式
    如果有多个窗口则先control+b z进入单窗口全屏模式(退出同样的指令)
    然后按住option键通过鼠标选中需要复制的文本行,释放鼠标后,选中文本行会自动复制到剪贴板

    格式化ntfs硬盘为ext4

  5. 查看分区
    1
    2
    lsblk -l
    sudo fdisk -l
  6. 卸载需要格式化的分区
    1
    sudo umount /dev/sda1
  7. 格式化需要的分区
    1
    sudo mkfs -t ext4 /dev/sda1

    硬盘重新分区(会删除所有数据)

  8. 清除分区表并创建新分区
    1
    sudo parted /dev/sda
  9. 进入parted交互模式后,执行以下命令
    1
    2
    3
    mklabel gpt # 标签
    mkpart primary ext4 0% 100% #只有一个分区独占所有空间
    quit
    当需要创建多个分区时
    1
    2
    3
    4
    5
    mkpart primary ext4 0% 20GB
    mkpart primary ext4 20GB 50GB
    mkpart primary ext4 50GB 100%
    print #查看创建的分区
    quit

手动挂载硬盘

  1. 输入 sudo fdisk -l 查看硬盘信息
  2. 创建一个挂载目录 mkdir /media/hdc/DATA1
  3. 挂载 sudo mount /dev/sda2 /media/hdc/DATA1

开机自动挂载硬盘

  1. 创建挂载文件目录, 并给读写权限
    1
    2
    mkdir /media/hdc/DATA1
    sudo chown -R hdc:hdc /media/hdc/DATA1
  2. 查看键盘uuid
    1
    sudo blkid
  3. 编辑/etc/fstab文件

    1
    2
    UUID=084A53DC4A53C55A /media/hdc/DATA1 ntfs defaults,utf8,uid=1000,gid=1000 0 0
    UUID=xxxx3 /media/hdc/DATA1 ext4 defaults 0 2

    PS:
    defaults:这是挂载选项。defaults 是一组默认挂载选项,包括:
    • rw: 读写模式
    • suid: 允许 SUID 和 SGID 位
    • dev: 解释字符或块设备
    • exec: 允许执行二进制文件
    • auto: 设备将在 mount -a 命令(用于在启动时挂载)时被自动挂载
    • nouser: 禁止普通用户挂载
    • async: 异步I/O操作
    0:这是dump备份选项,0 表示不需要使用 dump 进行备份。dump 是一个UNIX备份程序。
    2: 这是文件系统检查顺序(fsck)。1 通常用于根文件系统,其他文件系统用 2。0 表示启动时不检查该文件系统。

    sudo mount -a 可以测试
    开机后硬盘会自动挂载到/media/hdc/DATA1目录下

ssh远程快速复制当前绝对路径

为实现快速复制当前绝对路径在.bashrc中配置了快速复制的指令,如下

1
2
3
4
5
6
7
8
function cpwd { # cpwd可以替换成其他指令
if [ $# -eq 0 ]
then
echo "$(pwd)" | xargs echo -n | pbcopy && pwd # pbcopy 需额外安装 本地使用安装xclip
else
echo -n $(pwd)/$1 | pbcopy && echo $(pwd)/$1
fi
}

xclip需要手动安装

本地使用

ubuntu

  1. 使用 apt-get 安装 xclip
    sudo apt-get install xclip -y
  2. 注册 alias 到 ~/.bash_profile
    1
    2
    3
    4
    vim ~/.bashrc
    # 添加内容
    alias pbcopy='xclip -selection clipboard'
    alias pbpaste='xclip -selection clipboard -o'
  3. 载入 ~/.bash_profile
    source ~/.bashrc
  4. 使用 pbcopy 将文件内容复制到剪切板
    pbcopy < key_words.txt

centos

  1. 使用 yum 安装 xclip
    sudo yum install xclip
  2. 注册 alias 到 ~/.bash_profile
    1
    2
    3
    4
    vim ~/.bash_profile
    # 添加内容
    alias pbcopy='xclip -selection clipboard'
    alias pbpaste='xclip -selection clipboard -o'
  3. 载入 ~/.bash_profile
    source ~/.bash_profile
  4. 使用 pbcopy 将文件内容复制到剪切板
    pbcopy < key_words.txt

ssh 远程 (需搭配iterm2)

感谢大佬提供的远程pbcopy工具,需要搭配iterm使用

  1. 下载
    curl -fsSLo pbcopy-linux-amd64.tar.gz https://github.com/skaji/remote-pbcopy-iterm2/releases/latest/download/pbcopy-linux-amd64.tar.gz

  2. 解压
    tar xf pbcopy-linux-amd64.tar.gz

  3. 将解压后的文件移动到$PATH文件夹中,我这里直接丢到anaconda的bin里面了
    mv pbcopy /anaconda/bin/

ssh 远程 (无需iterm2, 没试过,给出git地址)

SSH反向代理

因为平时数据文献都在学校的台式机,虽然学校服务器可以在校外远程登录,但台式机只能通过向日葵等远程控制软件。现在通过带公网ip的私人服务器 反向代理实现随时随地ssh上学校台式机

学校台式机A 只能内网
带公网ip的服务器B

最好在A上配置B的免密登录

台式机A上开启反向代理

1
sudo ssh -fCNR B_port:localhost:22 B_user:B_ip

-f 后台执行ssh指令
-C 允许压缩数据
-N 不执行远程指令
-L 将本地机的某个端口转发到远端指定机器的指定端口

这行指令是将台式机A的22端口通过服务器B的端口B_port暴露出来,这样访问服务器B端口B_port的指令就会转发到台式机A的22端口

这时候去服务器B输入指令ssh -p B_port A_user:localhost 后输入密码可以登录到台式机A说明配置成功

PS: SFTP也是基于ssh的,所以类似PDF Export等支持SFTP的可以配置好,直接访问台式机上的文献。

autossh

ssh反向有时候会断掉,所以这里可以用autossh

  1. 先安装autossh
    1
    sudo apt install autossh
  2. 配置
    1
    autossh -M 12345 -fgnvNTR aliyun:2220:localhost:22 root@aliyun

    -M是通过监听12345端口防止断连

批量解压

find ./ -type f -name "*.zip" -exec unzip -o {} -d ./ \;

  • find ./ -type f -name "*.zip" :在当前目录下查找所有后缀为.zip的文件,包括子目录,用-type指定文件类型,-name指定匹配规则;
  • -exec:对每个查找到的文件执行指定的命令;
  • unzip -o {} -d ./:对每个.zip文件执行解压到指定目录的操作,{}表示被查找到的.zip文件名,-o参数表示覆盖同名文件,-d参数指定解压目录。
  • \;:shell中执行多个语句末尾固定操作,\表示换行,;参数表示多个语句。

设置autossh开机自启动

  1. 创建systemd文件

    1
    sudo vim /etc/systemd/system/autossh.service
  2. 编写内容如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [Unit]
    Description=autossh
    After=network-online.target

    [Service]

    Environment="AUTOSSH_GATETIME=0"
    User=userA
    WorkingDirectory=/home/userA
    ExecStart=/usr/bin/autossh -M 12345 -gnvNTR aliyun:2220:localhost:22 root@aliyun -o ServerAliveInterval=600

    [Install]
    WantedBy=multi-user.target

    需要注意的是参数为-gnvNTR而不是-fgnvNTR,因为在systemctl中不支持f参数,不要复制粘贴错了,会无法运行的。

  3. Reload systemd

    1
    sudo systemctl daemon-reload
  4. Start the Autossh service

    1
    sudo systemctl start autossh.service
  5. Enable at boot
    1
    sudo systemctl enable autossh.service
  6. 查看状态

    1
    sudo systemctl status autossh
  7. 解决SSH 长时间不操作卡死
    在台式机A输入

    1
    2
    vim /etc/ssh/ssh_config
    ServerAliveInterval 60

    在服务器B输入

    1
    2
    vim /etc/ssh/ssh_config
    ServerAliveInterval 60

Git仓库

安装

apt install gituser

创建用户

  1. 创建用户
    useradd -m gituser
  2. 设置密码
    passwd gituser

  3. 切换到git用户
    su - gituser

  4. 初始化一个仓库
    git init --bare project1.git

  5. 建立连接(或下载远端代码)
    git clone git@IP:project1.git

samba

SAMBA(SMB)的共享是最方便的共享模式,Ubuntu想要开启SMB,则需要启动SMB服务以及修改SMB的配置文件。

  1. 安装samba服务
    sudo apt-get install samba

  2. 修改在/etc/samba/ 下的默认配置文件smb.conf

如果你有多个用户同时使用,都希望有自己的文件夹的话,可以开启下面的配置(删除分号)

找到smb.conf中的如下几行

1
2
3
4
5
6
7
8
9
10
11
#======================= Share Definitions =======================
……
;[homes]
; comment = Home Directories
; browseable = no
; read only = yes
; create mask = 0700
; directory mask = 0700
; guest ok = no
; path = /media/xxx/DATA1/homes/%s
; valid users = %S

家目录[homes]类似于群晖的homes,每个有效的smb用户都会在这个homes文件夹下创建一个自己的home,每个人仅能访问自己的home。将注释全部去掉则可以创建;此部分需要配置path, %S前的路径需要提前创建,名字不一定要叫Homes.

SMB并不占用整块磁盘,你可以仅共享某一个目录,这里取决于你的组织方式;你可以将所有磁盘映射成一个目录下的不同子目录,或将一个磁盘映射出多个目录来进行共享,这里我将一块磁盘的一个目录共享出来,你可以根据自己的习惯来命名不同的配置,比如叫Media/Data/Backup等;

下面就是smb.conf的共享文件夹部分的配置,可以按照格式接续添加;主要的修改部分是修改path,以及权限配置。如果需要指定哪些用户能够使用samba,则还需要指定valid users,以及生成对应的用户的密码。这里我没暂时没有写,有需要的请自己Google一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[Data1]
comment = share folder
browseable = yes
path = /media/xxx/DATA1/DATA_1
create mask = 0700
directory mask = 0700
public = yes
available = yes
writable = yes
[Data2]
path = /media/xxx/DATA2/DATA_2
browseable = yes
create mask = 0700
directory mask = 0700
public = yes
available = yes
writable = yes
[Data3]
path = /media/chenyz/DATA3/DATA_3
browseable = yes
create mask = 0700
directory mask = 0700
public = yes
valid users = netlogin xxx
available = yes
writable = yes
  1. 常用指令
    启动
    sudo service smbd start
    查看状态
    sudo service smbd status

    root用户anaconda给其他用户使用

    服务器里安装了anaconda,结果发现只有root用户才能使用,其他的用户都无法使用conda命令!

    解决方案

    首先,root用户安装anaconda的时候,需要安装在普通用户可以访问的目录下,比如/usr/local、/opt、/home之类的

    其次,普通用户登陆后,需要执行以下conda init 使conda的路径等系统环境变量信息写入当前用户的bashrc下

    首先确定root用户anaconda安装路径,一般如下

    1
    /home/root/anaconda3

    普通用户执行

    1
    /home/root/anaconda3/bin/conda init bash

    普通用户再执行启用配置命令

    1
    source ~/.bashrc

给PDF扩白边

  1. 安装pdfCrop
    sudo apt install texlive-extra-utils

  2. 自动将周围白边去除
    pdfcrop input.pdf output.pdf

  3. 指定留白宽度为左边 10、上方 20、右边 10、下方 25 (我们左右扩为120)
    pdfcrop --margins "40 20 40 25" input.pdf output.pdf

  4. 多PDF文档处理: 用shell指令,如下:

    1
    2
    3
    4
    5
    #!/bin/bash
    # 自动切除所有PDF页面的白边
    for FILE in ./*.pdf; do
    pdfcrop "${FILE}"
    done
  5. 写成指令函数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # pdf扩白边
    function pdfE {
    if [ $# -eq 1 ]
    then
    pdfcrop --margins "120 20 120 25" "$1" "$1"
    else
    echo 'error file'
    fi

    }

    调用方式
    pdfE file.pdf

Ubuntu创建用户到指定目录下

  1. 在指定目录创建一个用户文件夹

    1
    sudo mkdir /media/ssd/user
  2. 创建用户在此目录

    1
    sudo useradd -d /media/ssd/user user
  3. 将新用户的主目录的权限设置为新用户的所有者和所属组

    1
    sudo chown user:user /media/ssd/user
  4. 设置密码

    1
    sudo passwd user
  5. 绑定bash

    1
    usermod -s /bin/bash [user]
  6. 删除用户

    1
    2
    sudo userdel user
    sudo rm -rf /media/ssd/user

ssh实现Linux中vim复制指令复制文本到当前系统剪切板

参考网页设置

  1. 配置vim复制
    在vim配置文件 /etc/vim/vimrc 中配置如下指令
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    function Copy()
    let c = join(v:event.regcontents,"\n")
    let c64 = system("base64", c)
    let s = "\e]52;c;" . trim(c64) . "\x07"
    call s:raw_echo(s)
    endfunction

    function! s:raw_echo(str)
    if has('win32') && has('nvim')
    call chansend(v:stderr, a:str)
    else
    if filewritable('/dev/fd/2')
    call writefile([a:str], '/dev/fd/2', 'b')
    else
    exec("silent! !echo " . shellescape(a:str))
    redraw!
    endif
    endif
    endfunction

    autocmd TextYankPost * call Copy()
  2. 配置在tmux中可继承复制
    在vim配置文件 ~/.tmux.conf中加入如下配置
    1
    2
    # Enable clipboard integration
    set -g set-clipboard on

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!