分类 技术 下的文章

我一直在想,为什么我服务器上 vim 为什么在鼠标方面表现得如此愚蠢:不能像平时那样跳转、复制、粘贴。尽管在 /etc/vim/vimrc.local 中已经设置了。

set mouse=

最后我终于知道为什么了,多谢 bug #864074 并且修复了它。

原因是,当没有 ~/.vimrc 的时候,vim 在 vimrc.local 之后加载 defaults.vim,从而覆盖了几个设置。

/etc/vim/vimrc 中有一个注释(虽然我没有看到)解释了这一点:

" Vim will load $VIMRUNTIME/defaults.vim if the user does not have a vimrc.
" This happens after /etc/vim/vimrc(.local) are loaded, so it will override
" any settings in these files.
" If you don't want that to happen, uncomment the below line to prevent
" defaults.vim from being loaded.
" let g:skip_defaults_vim = 1

我同意这是在正常安装 vim 后设置 vim 的好方法,但 Debian 包可以做得更好。在错误报告中清楚地说明了这个问题:如果没有 ~/.vimrc/etc/vim/vimrc.local 中的设置被覆盖。

这在Debian中是违反直觉的 - 而且我也不知道其他包中是否采用类似的方法。

由于 defaults.vim 中的设置非常合理,所以我希望使用它,但只修改了一些我不同意的项目,比如鼠标。最后,我在 /etc/vim/vimrc.local 中做了以下操作:

if filereadable("/usr/share/vim/vim80/defaults.vim")
  source /usr/share/vim/vim80/defaults.vim
endif
" now set the line that the defaults file is not reloaded afterwards!
let g:skip_defaults_vim = 1

" turn of mouse
set mouse=
" other override settings go here

可能有更好的方式来获得一个不依赖于 vim 版本的通用加载语句, 但现在我对此很满意。


via: https://www.preining.info/blog/2017/10/fixing-vim-in-debian/

作者:Norbert Preining 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

目标:仅使用命令行工具来配置 WiFi

发行版:适用主流的那些发行版

要求:安装了无线网卡的 Linux 并且拥有 root 权限。

难度:简单

约定:

  • # - 需要使用 root 权限来执行指定命令,可以直接使用 root 用户来执行,也可以使用 sudo 命令
  • $ - 可以使用普通用户来执行指定命令

简介

许多人喜欢用图形化的工具来管理电脑,但也有很多人不喜欢这样做。如果你比较喜欢命令行工具,管理 WiFi 会是件很痛苦的事情。然而,事情本不该如此。

wpa\_supplicant 可以作为命令行工具来用。使用一个简单的配置文件就可以很容易设置号 WiFi。

扫描网络

若你已经知道了网络的信息,就可以跳过这一步。如果不了解的话,则这是一个找出网络信息的好方法。

wpa\_supplicant 中有一个工具叫做 wpa_cli,它提供了一个命令行接口来管理你的 WiFi 连接。事实上你可以用它来设置任何东西,但是设置一个配置文件看起来要更容易一些。

使用 root 权限运行 wpa_cli,然后扫描网络。

# wpa_cli
> scan

扫描过程要花上一点时间,并且会显示所在区域的那些网络。记住你想要连接的那个网络。然后输入 quit 退出。

生成配置块并且加密你的密码

还有更方便的工具可以用来设置配置文件。它接受网络名称和密码作为参数,然后生成一个包含该网路配置块(其中的密码被加密处理了)的配置文件。

# wpa_passphrase networkname password > /etc/wpa_supplicant/wpa_supplicant.conf

裁剪你的配置

现在你已经有了一个配置文件了,这个配置文件就是 /etc/wpa_supplicant/wpa_supplicant.conf。其中的内容并不多,只有一个网络块,其中有网络名称和密码,不过你可以在此基础上对它进行修改。

用喜欢的编辑器打开该文件,首先删掉说明密码的那行注释。然后,将下面行加到配置最上方。

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=wheel

这一行只是让 wheel 组中的用户可以管理 wpa\_supplicant。这会方便很多。

其他的内容则添加到网络块中。

如果你要连接到一个隐藏网络,你可以添加下面行来通知 wpa\_supplicant 先扫描该网络。

scan_ssid=1

下一步,设置协议以及密钥管理方面的配置。下面这些是 WPA2 相关的配置。

proto=RSN
key_mgmt=WPA-PSK

grouppairwise 配置告诉 wpa\_supplicant 你是否使用了 CCMP、TKIP,或者两者都用到了。为了安全考虑,你应该只用 CCMP。

group=CCMP
pairwise=CCMP

最后,设置网络优先级。越高的值越会优先连接。

priority=10

Complete WPA_Supplicant Settings

保存配置然后重启 wpa\_supplicant 来让改动生效。

结语

当然,该方法并不是用于即时配置无线网络的最好方法,但对于定期连接的网络来说,这种方法非常有效。


via: https://linuxconfig.org/connect-to-wifi-from-the-linux-command-line

作者:Nick Congleton 译者:lujun9972 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Q:我想找出所有的 *.doc 文件并将它们创建成一个 tar 包,然后存储在 /nfs/backups/docs/file.tar 中。是否可以在 Linux 或者类 Unix 系统上查找并 tar 打包文件?

find 命令用于按照给定条件在目录层次结构中搜索文件。tar 命令是用于 Linux 和类 Unix 系统创建 tar 包的归档工具。

How to find and tar files on linux unix

让我们看看如何将 tar 命令与 find 命令结合在一个命令行中创建一个 tar 包。

Find 命令

语法是:

find /path/to/search -name "file-to-search" -options
## 找出所有 Perl(*.pl)文件 ##
find $HOME -name "*.pl" -print
## 找出所有 *.doc 文件 ##
find $HOME -name "*.doc" -print
## 找出所有 *.sh(shell 脚本)并运行 ls -l 命令 ##
find . -iname "*.sh" -exec ls -l {} +

最后一个命令的输出示例:

-rw-r--r-- 1 vivek vivek 1169 Apr  4  2017 ./backups/ansible/cluster/nginx.build.sh
-rwxr-xr-x 1 vivek vivek 1500 Dec  6 14:36 ./bin/cloudflare.pure.url.sh
lrwxrwxrwx 1 vivek vivek   13 Dec 31  2013 ./bin/cmspostupload.sh -> postupload.sh
lrwxrwxrwx 1 vivek vivek   12 Dec 31  2013 ./bin/cmspreupload.sh -> preupload.sh
lrwxrwxrwx 1 vivek vivek   14 Dec 31  2013 ./bin/cmssuploadimage.sh -> uploadimage.sh
lrwxrwxrwx 1 vivek vivek   13 Dec 31  2013 ./bin/faqpostupload.sh -> postupload.sh
lrwxrwxrwx 1 vivek vivek   12 Dec 31  2013 ./bin/faqpreupload.sh -> preupload.sh
lrwxrwxrwx 1 vivek vivek   14 Dec 31  2013 ./bin/faquploadimage.sh -> uploadimage.sh
-rw-r--r-- 1 vivek vivek  778 Nov  6 14:44 ./bin/mirror.sh
-rwxr-xr-x 1 vivek vivek  136 Apr 25  2015 ./bin/nixcraft.com.301.sh
-rwxr-xr-x 1 vivek vivek  547 Jan 30  2017 ./bin/paypal.sh
-rwxr-xr-x 1 vivek vivek  531 Dec 31  2013 ./bin/postupload.sh
-rwxr-xr-x 1 vivek vivek  437 Dec 31  2013 ./bin/preupload.sh
-rwxr-xr-x 1 vivek vivek 1046 May 18  2017 ./bin/purge.all.cloudflare.domain.sh
lrwxrwxrwx 1 vivek vivek   13 Dec 31  2013 ./bin/tipspostupload.sh -> postupload.sh
lrwxrwxrwx 1 vivek vivek   12 Dec 31  2013 ./bin/tipspreupload.sh -> preupload.sh
lrwxrwxrwx 1 vivek vivek   14 Dec 31  2013 ./bin/tipsuploadimage.sh -> uploadimage.sh
-rwxr-xr-x 1 vivek vivek 1193 Oct 18  2013 ./bin/uploadimage.sh
-rwxr-xr-x 1 vivek vivek   29 Nov  6 14:33 ./.vim/plugged/neomake/tests/fixtures/errors.sh
-rwxr-xr-x 1 vivek vivek  215 Nov  6 14:33 ./.vim/plugged/neomake/tests/helpers/trap.sh

Tar 命令

创建 /home/vivek/projects 目录的 tar 包,运行:

$ tar -cvf /home/vivek/projects.tar /home/vivek/projects

结合 find 和 tar 命令

语法是:

find /dir/to/search/ -name "*.doc" -exec tar -rvf out.tar {} \;

或者

find /dir/to/search/ -name "*.doc" -exec tar -rvf out.tar {} +

例子:

find $HOME -name "*.doc" -exec tar -rvf /tmp/all-doc-files.tar "{}" \;

或者

find $HOME -name "*.doc" -exec tar -rvf /tmp/all-doc-files.tar "{}" +

这里,find 命令的选项:

  • -name "*.doc":按照给定的模式/标准查找文件。在这里,在 $HOME 中查找所有 *.doc 文件。
  • -exec tar ... :对 find 命令找到的所有文件执行 tar 命令。

这里,tar 命令的选项:

  • -r:将文件追加到归档末尾。参数与 -c 选项具有相同的含义。
  • -v:详细输出。
  • -f out.tar : 将所有文件追加到 out.tar 中。

也可以像下面这样将 find 命令的输出通过管道输入到 tar 命令中:

find $HOME -name "*.doc" -print0 | tar -cvf /tmp/file.tar --null -T - 

传递给 find 命令的 -print0 选项处理特殊的文件名。--null-T 选项告诉 tar 命令从标准输入/管道读取输入。也可以使用 xargs 命令:

find $HOME -type f -name "*.sh" | xargs tar cfvz /nfs/x230/my-shell-scripts.tgz

有关更多信息,请参阅下面的 man 页面:

$ man tar
$ man find
$ man xargs
$ man bash

作者简介:

作者是 nixCraft 的创造者,是一名经验丰富的系统管理员,也是 Linux 操作系统/Unix shell 脚本培训师。他曾与全球客户以及 IT、教育、国防和太空研究以及非营利部门等多个行业合作。在 Twitter、Facebook 和 Google+ 上关注他。


via: https://www.cyberciti.biz/faq/linux-unix-find-tar-files-into-tarball-command/

作者:Vivek Gite 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

像许多笔记本用户一样,我经常将笔记本插入到不同的显示器上(桌面上有多台显示器,演示时有投影机等)。运行 xrandr 命令或点击界面非常繁琐,编写脚本也不是很好。

最近,我遇到了 autorandr,它使用 EDID(和其他设置)检测连接的显示器,保存 xrandr 配置并恢复它们。它也可以在加载特定配置时运行任意脚本。我已经打包了它,目前仍在 NEW 状态。如果你不能等待,这是 deb这是 git 仓库

要使用它,只需安装软件包,并创建你的初始配置(我这里用的名字是 undocked):

autorandr --save undocked

然后,连接你的笔记本(或者插入你的外部显示器),使用 xrandr(或其他任何)更改配置,然后保存你的新配置(我这里用的名字是 workstation):

autorandr --save workstation

对你额外的配置(或当你有新的配置)进行重复操作。

autorandrudevsystemdpm-utils 钩子,当新的显示器出现时 autorandr --change 应该会立即运行。如果需要,也可以手动运行 autorandr --changeautorandr - load workstation。你也可以在加载配置后在 ~/.config/autorandr/$PROFILE/postswitch 添加自己的脚本来运行。由于我运行 i3,我的工作站配置如下所示:

#!/bin/bash

xrandr --dpi 92
xrandr --output DP2-2 --primary
i3-msg '[workspace="^(1|4|6)"] move workspace to output DP2-2;'
i3-msg '[workspace="^(2|5|9)"] move workspace to output DP2-3;'
i3-msg '[workspace="^(3|8)"] move workspace to output DP2-1;'

它适当地修正了 dpi,设置主屏幕(可能不需要?),并移动 i3 工作区。你可以通过在配置文件目录中添加一个 block 钩子来安排配置永远不会运行。

如果你定期更换显示器,请看一下!


via: https://www.donarmstrong.com/posts/autorandr/

作者:Don Armstrong 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

今天让我们来讨论一下如何创建 Ubuntu Live CD 的定制镜像(ISO)。我们以前可以使用 Pinguy Builder 完成这项工作。但是,现在它似乎停止维护了。最近 Pinguy Builder 的官方网站似乎没有任何更新。幸运的是,我找到了另一种创建 Ubuntu Live CD 镜像的工具。使用 Cubic (即 Custom Ubuntu ISO Creator 的首字母缩写),这是一个用来创建定制的可启动的 Ubuntu Live CD(ISO)镜像的 GUI 应用程序。

Cubic 正在积极开发,它提供了许多选项来轻松地创建一个定制的 Ubuntu Live CD ,它有一个集成的 chroot 命令行环境(LCTT 译注:chroot —— Change Root,也就是改变程序执行时所参考的根目录位置),在那里你可以定制各种方面,比如安装新的软件包、内核,添加更多的背景壁纸,添加更多的文件和文件夹。它有一个直观的 GUI 界面,在 live 镜像创建过程中可以轻松的利用导航(可以利用点击鼠标来回切换)。您可以创建一个新的自定义镜像或修改现有的项目。因为它可以用来制作 Ubuntu live 镜像,所以我相信它可以用在制作其他 Ubuntu 的发行版和衍生版镜像中,比如 Linux Mint。

安装 Cubic

Cubic 的开发人员已经做出了一个 PPA 来简化安装过程。要在 Ubuntu 系统上安装 Cubic ,在你的终端上运行以下命令:

sudo apt-add-repository ppa:cubic-wizard/release
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 6494C6D6997C215E
sudo apt update
sudo apt install cubic

利用 Cubic 创建 Ubuntu Live CD 的定制镜像

安装完成后,从应用程序菜单或 dock 启动 Cubic。这是在我在 Ubuntu 16.04 LTS 桌面系统中 Cubic 的样子。

为新项目选择一个目录。它是保存镜像文件的目录。

请注意,Cubic 不是创建您当前系统的 Live CD 镜像,而是利用 Ubuntu 的安装 CD 来创建一个定制的 Live CD,因此,你应该有一个最新的 ISO 镜像。

选择您存储 Ubuntu 安装 ISO 镜像的路径。Cubic 将自动填写您定制操作系统的所有细节。如果你愿意,你可以改变细节。单击 Next 继续。

接下来,来自源安装介质中的压缩的 Linux 文件系统将被提取到项目的目录(在我们的例子中目录的位置是 /home/ostechnix/custom_ubuntu)。

一旦文件系统被提取出来,将自动加载到 chroot 环境。如果你没有看到终端提示符,请按几次回车键。

在这里可以安装任何额外的软件包,添加背景图片,添加软件源列表,添加最新的 Linux 内核和所有其他定制到你的 Live CD 。

例如,我希望 vim 安装在我的 Live CD 中,所以现在就要安装它。

我们不需要使用 sudo,因为我们已经在具有最高权限(root)的环境中了。

类似地,如果需要,可以安装更多的任何版本 Linux 内核。

apt install linux-image-extra-4.10.0-24-generic

此外,您还可以更新软件源列表(添加或删除软件存储库列表):

修改源列表后,不要忘记运行 apt update 命令来更新源列表:

apt update

另外,您还可以向 Live CD 中添加文件或文件夹。复制文件或文件夹(右击它们并选择复制或者利用 CTRL+C),在终端右键单击(在 Cubic 窗口内),选择 “Paste file(s)”,最后点击 Cubic 向导底部的 “Copy”。

Ubuntu 17.10 用户注意事项

在 Ubuntu 17.10 系统中,DNS 查询可能无法在 chroot 环境中工作。如果您正在制作一个定制的 Ubuntu 17.10 Live 镜像,您需要指向正确的 resolve.conf 配置文件:

ln -sr /run/systemd/resolve/resolv.conf /run/systemd/resolve/stub-resolv.conf

要验证 DNS 解析工作,运行:

cat /etc/resolv.conf
ping google.com

如果你想的话,可以添加你自己的壁纸。要做到这一点,请切换到 /usr/share/backgrounds/ 目录,

cd /usr/share/backgrounds

并将图像拖放到 Cubic 窗口中。或复制图像,右键单击 Cubic 终端窗口并选择 “Paste file(s)” 选项。此外,确保你在 /usr/share/gnome-backproperties 的XML文件中添加了新的壁纸,这样你可以在桌面上右键单击新添加的图像选择 “Change Desktop Background” 进行交互。完成所有更改后,在 Cubic 向导中单击 “Next”。

接下来,选择引导到新的 Live ISO 镜像时使用的 Linux 内核版本。如果已经安装了其他版本内核,它们也将在这部分中被列出。然后选择您想在 Live CD 中使用的内核。

在下一节中,选择要从您的 Live 映像中删除的软件包。在使用定制的 Live 映像安装完 Ubuntu 操作系统后,所选的软件包将自动删除。在选择要删除的软件包时,要格外小心,您可能在不知不觉中删除了一个软件包,而此软件包又是另外一个软件包的依赖包。

接下来, Live 镜像创建过程将开始。这里所要花费的时间取决于你定制的系统规格。

镜像创建完成后后,单击 “Finish”。Cubic 将显示新创建的自定义镜像的细节。

如果你想在将来修改刚刚创建的自定义 Live 镜像,不要选择“ Delete all project files, except the generated disk image and the corresponding MD5 checksum file”(除了生成的磁盘映像和相应的 MD5 校验和文件之外,删除所有的项目文件**) ,Cubic 将在项目的工作目录中保留自定义图像,您可以在将来进行任何更改。而不用从头再来一遍。

要为不同的 Ubuntu 版本创建新的 Live 镜像,最好使用不同的项目目录。

利用 Cubic 修改 Ubuntu Live CD 的定制镜像

从菜单中启动 Cubic ,并选择一个现有的项目目录。单击 “Next” 按钮,您将看到以下三个选项:

  1. Create a disk image from the existing project. (从现有项目创建一个磁盘映像。)
  2. Continue customizing the existing project.(继续定制现有项目。)
  3. Delete the existing project.(删除当前项目。)

第一个选项将允许您从现有项目中使用之前所做的自定义设置创建一个新的 Live ISO 镜像。如果您丢失了 ISO 镜像,您可以使用第一个选项来创建一个新的。

第二个选项允许您在现有项目中进行任何其他更改。如果您选择此选项,您将再次进入 chroot 环境。您可以添加新的文件或文件夹,安装任何新的软件,删除任何软件,添加其他的 Linux 内核,添加桌面背景等等。

第三个选项将删除现有的项目,所以您可以从头开始。选择此选项将删除所有文件,包括新生成的 ISO 镜像文件。

我用 Cubic 做了一个定制的 Ubuntu 16.04 LTS 桌面 Live CD 。就像这篇文章里描述的一样。如果你想创建一个 Ubuntu Live CD, Cubic 可能是一个不错的选择。

就这些了,再会!


via: https://www.ostechnix.com/create-custom-ubuntu-live-cd-image/

作者:SK 译者:stevenzdg988 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

我在远程主机上上设置过一个叫做 file\_repl 的 bash 别名 。当我使用 ssh 命令登录远程主机后,可以很正常的使用这个别名。然而这个 bash 别名却无法通过 ssh 来运行,像这样:

$ ssh [email protected] file_repl
bash:file_repl:command not found

我要怎样做才能通过 ssh 命令运行 bash 别名呢?

SSH 客户端 (ssh) 是一个登录远程服务器并在远程系统上执行 shell 命令的 Linux/Unix 命令。它被设计用来在两个非信任的机器上通过不安全的网络(比如互联网)提供安全的加密通讯。

如何用 ssh 客户端执行命令

通过 ssh 运行 free 命令或 date 命令 可以这样做:

$ ssh [email protected] date

结果为:

Tue Dec 26 09:02:50 UTC 2017

或者:

$ ssh [email protected] free -h

结果为:

 total used free shared buff/cache available
Mem:2.0G 428M 138M 145M 1.4G 1.1G
Swap:0B 0B 0B

理解 bash shell 以及命令的类型

bash shell 共有下面几类命令:

  1. 别名,比如 ll
  2. 关键字,比如 if
  3. 函数 (用户自定义函数,比如 genpasswd
  4. 内置命令,比如 pwd
  5. 外部文件,比如 /bin/date

type 命令command 命令 可以用来查看命令类型:

$ type -a date
date is /bin/date
$ type -a free
free is /usr/bin/free
$ command -V pwd
pwd is a shell builtin
$ type -a file_repl
is aliased to `sudo -i /shared/takes/master.replication'

datefree 都是外部命令,而 file_replsudo -i /shared/takes/master.replication 的别名。你不能直接执行像 file_repl 这样的别名:

$ ssh user@remote file_repl

在 Unix 系统上无法直接通过 ssh 客户端执行 bash 别名

要解决这个问题可以用下面方法运行 ssh 命令:

$ ssh -t user@remote /bin/bash -ic 'your-alias-here'
$ ssh -t user@remote /bin/bash -ic 'file_repl'

ssh 命令选项:

bash shell 的选项:

  • -i:运行交互 shell,这样 shell 才能运行 bash 别名。
  • -c:要执行的命令取之于第一个非选项参数的命令字符串。若在命令字符串后面还有其他参数,这些参数会作为位置参数传递给命令,参数从 $0 开始。

总之,要运行一个名叫 ll 的 bash 别名,可以运行下面命令:

$ ssh -t [email protected] -ic 'll'

结果为:

Running bash aliases over ssh based session when using Unix or Linux ssh cli

下面是我的一个 shell 脚本的例子:

#!/bin/bash
I="tags.deleted.410"
O="/tmp/https.www.cyberciti.biz.410.url.conf"
box="[email protected]"
[!-f "$I" ] && { echo "$I file not found。"; exit 10; }
>$O
cat "$I" | sort | uniq | while read -r u
do
    uu="${u##https://www.cyberciti.biz}"
    echo "~^$uu 1;" >>"${O}"
done
echo "Config file created at ${O} and now updating remote nginx config file"
scp "${O}" ${box}:/tmp/
ssh ${box} /usr/bin/lxc file push /tmp/https.www.cyberciti.biz.410.url.conf nginx-container/etc/nginx/
ssh -t ${box} /bin/bash -ic 'push_config_job'

相关资料

更多信息请输入下面命令查看 OpenSSH 客户端bash 的 man 帮助

$ man ssh
$ man bash
$ help type
$ help command

via: https://www.cyberciti.biz/faq/use-bash-aliases-ssh-based-session/

作者:Vivek Gite 译者:lujun9972 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出