Linux指令拾遗
cmd指令修改自动/手动Ip
- 自动获取ip:
1
2netsh interface ip set address name="本地连接" source=dhcp
netsh interface ip set dns name="本地连接" source=dhcp - 手动获取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显存占用
- 查看占用进程
fuser -v /dev/nvidia*
- 批量清除
fuser -v /dev/nvidia* |awk '{for(i=1;i<=NF;i++)print "kill -9 " $i;}' | sh
- 快捷指令
为实现快速批量kill 可以在.bashrc中配置了快速复制的指令,如下1
2
3
4function 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 -9
xargs命令把前面命令的输出结果(PID)作为”kill -9”命令的参数,并执行
查看端口监听占用
netstat -nap |grep [端口号]
Linux断点续传(代替scp)
- 文件上传/下载
1
rsync -rP --rsh=ssh PATH username@hostname:PATH
- 文件夹上传/下载
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
3curl "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切换窗口居然还是只能用快捷键,哪怕改了配置接了鼠标。。。
- 安装
不同系统平台不一样自行百度
redhat、centos 或 fedora:yum install tmux
ubuntu:apt-get install tmux
Macbrew install tmux
- 常用指令
启动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 方向键 配置优化
可以自定义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
复制
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
- 查看分区
1
2lsblk -l
sudo fdisk -l - 卸载需要格式化的分区
1
sudo umount /dev/sda1
- 格式化需要的分区
1
sudo mkfs -t ext4 /dev/sda1
硬盘重新分区(会删除所有数据)
- 清除分区表并创建新分区
1
sudo parted /dev/sda
- 进入parted交互模式后,执行以下命令当需要创建多个分区时
1
2
3mklabel gpt # 标签
mkpart primary ext4 0% 100% #只有一个分区独占所有空间
quit1
2
3
4
5mkpart primary ext4 0% 20GB
mkpart primary ext4 20GB 50GB
mkpart primary ext4 50GB 100%
print #查看创建的分区
quit
手动挂载硬盘
- 输入
sudo fdisk -l
查看硬盘信息 - 创建一个挂载目录
mkdir /media/hdc/DATA1
- 挂载
sudo mount /dev/sda2 /media/hdc/DATA1
开机自动挂载硬盘
- 创建挂载文件目录, 并给读写权限
1
2mkdir /media/hdc/DATA1
sudo chown -R hdc:hdc /media/hdc/DATA1 - 查看键盘uuid
1
sudo blkid
编辑/etc/fstab文件
1
2UUID=084A53DC4A53C55A /media/hdc/DATA1 ntfs defaults,utf8,uid=1000,gid=1000 0 0
UUID=xxxx3 /media/hdc/DATA1 ext4 defaults 0 2PS:
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
8function 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
- 使用 apt-get 安装 xclip
sudo apt-get install xclip -y
- 注册 alias 到 ~/.bash_profile
1
2
3
4vim ~/.bashrc
# 添加内容
alias pbcopy='xclip -selection clipboard'
alias pbpaste='xclip -selection clipboard -o' - 载入 ~/.bash_profile
source ~/.bashrc
- 使用 pbcopy 将文件内容复制到剪切板
pbcopy < key_words.txt
centos
- 使用 yum 安装 xclip
sudo yum install xclip
- 注册 alias 到
~/.bash_profile
1
2
3
4vim ~/.bash_profile
# 添加内容
alias pbcopy='xclip -selection clipboard'
alias pbpaste='xclip -selection clipboard -o' - 载入
~/.bash_profile
source ~/.bash_profile
- 使用 pbcopy 将文件内容复制到剪切板
pbcopy < key_words.txt
ssh 远程 (需搭配iterm2)
感谢大佬提供的远程pbcopy工具,需要搭配iterm使用
下载
curl -fsSLo pbcopy-linux-amd64.tar.gz https://github.com/skaji/remote-pbcopy-iterm2/releases/latest/download/pbcopy-linux-amd64.tar.gz
解压
tar xf pbcopy-linux-amd64.tar.gz
将解压后的文件移动到$PATH文件夹中,我这里直接丢到anaconda的bin里面了
mv pbcopy /anaconda/bin/
ssh 远程 (无需iterm2, 没试过,给出git地址)
SSH反向代理
因为平时数据文献都在学校的台式机,虽然学校服务器可以在校外远程登录,但台式机只能通过向日葵等远程控制软件。现在通过带公网ip的私人服务器 反向代理实现随时随地ssh上学校台式机
学校台式机A 只能内网
带公网ip的服务器B
最好在A上配置B的免密登录
台式机A上开启反向代理
1 |
|
-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
- 先安装autossh
1
sudo apt install autossh
- 配置
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开机自启动
创建systemd文件
1
sudo vim /etc/systemd/system/autossh.service
编写内容如下:
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参数,不要复制粘贴错了,会无法运行的。
Reload systemd
1
sudo systemctl daemon-reload
Start the Autossh service
1
sudo systemctl start autossh.service
- Enable at boot
1
sudo systemctl enable autossh.service
查看状态
1
sudo systemctl status autossh
解决SSH 长时间不操作卡死
在台式机A输入1
2vim /etc/ssh/ssh_config
ServerAliveInterval 60在服务器B输入
1
2vim /etc/ssh/ssh_config
ServerAliveInterval 60
Git仓库
安装
apt install gituser
创建用户
- 创建用户
useradd -m gituser
设置密码
passwd gituser
切换到git用户
su - gituser
初始化一个仓库
git init --bare project1.git
建立连接(或下载远端代码)
git clone git@IP:project1.git
samba
SAMBA(SMB)的共享是最方便的共享模式,Ubuntu想要开启SMB,则需要启动SMB服务以及修改SMB的配置文件。
安装samba服务
sudo apt-get install samba
修改在/etc/samba/ 下的默认配置文件smb.conf
如果你有多个用户同时使用,都希望有自己的文件夹的话,可以开启下面的配置(删除分号)
找到smb.conf中的如下几行
1 |
|
家目录[homes]类似于群晖的homes,每个有效的smb用户都会在这个homes文件夹下创建一个自己的home,每个人仅能访问自己的home。将注释全部去掉则可以创建;此部分需要配置path, %S前的路径需要提前创建,名字不一定要叫Homes.
SMB并不占用整块磁盘,你可以仅共享某一个目录,这里取决于你的组织方式;你可以将所有磁盘映射成一个目录下的不同子目录,或将一个磁盘映射出多个目录来进行共享,这里我将一块磁盘的一个目录共享出来,你可以根据自己的习惯来命名不同的配置,比如叫Media/Data/Backup等;
下面就是smb.conf的共享文件夹部分的配置,可以按照格式接续添加;主要的修改部分是修改path,以及权限配置。如果需要指定哪些用户能够使用samba,则还需要指定valid users,以及生成对应的用户的密码。这里我没暂时没有写,有需要的请自己Google一下
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扩白边
安装pdfCrop
sudo apt install texlive-extra-utils
自动将周围白边去除
pdfcrop input.pdf output.pdf
指定留白宽度为左边 10、上方 20、右边 10、下方 25 (我们左右扩为120)
pdfcrop --margins "40 20 40 25" input.pdf output.pdf
多PDF文档处理: 用shell指令,如下:
1
2
3
4
5#!/bin/bash
# 自动切除所有PDF页面的白边
for FILE in ./*.pdf; do
pdfcrop "${FILE}"
done写成指令函数
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
sudo mkdir /media/ssd/user
创建用户在此目录
1
sudo useradd -d /media/ssd/user user
将新用户的主目录的权限设置为新用户的所有者和所属组
1
sudo chown user:user /media/ssd/user
设置密码
1
sudo passwd user
绑定bash
1
usermod -s /bin/bash [user]
删除用户
1
2sudo userdel user
sudo rm -rf /media/ssd/user
ssh实现Linux中vim复制指令复制文本到当前系统剪切板
参考网页设置
- 配置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
21function 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() - 配置在tmux中可继承复制
在vim配置文件 ~/.tmux.conf中加入如下配置1
2# Enable clipboard integration
set -g set-clipboard on
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!