分类 技术 下的文章

有几个命令可以帮助你在 Linux 系统上看到网络状况,这些包括 ip、ethtool、traceroute、tcptraceroute 和 tcpdump。

ifconfignetstat 命令当然非常有用,但还有很多其它命令能帮你查看 Linux 系统上的网络状况。本文探索了一些检查网络连接的非常简便的命令。

ip 命令

ip 命令显示了许多与你使用 ifconfig 命令时的一样信息。其中一些信息以不同的格式呈现,比如显示 192.168.0.6/24,而不是 inet addr:192.168.0.6 Bcast:192.168.0.255,尽管 ifconfig 更适合数据包计数,但 ip 命令有许多有用的选项。

首先,ip a 命令可以列出所有网络接口的信息。

$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
 inet 127.0.0.1/8 scope host lo
 valid_lft forever preferred_lft forever
 inet6 ::1/128 scope host
 valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
 link/ether 00:1e:4f:c8:43:fc brd ff:ff:ff:ff:ff:ff
 inet 192.168.0.6/24 brd 192.168.0.255 scope global eth0
 valid_lft forever preferred_lft forever
 inet6 fe80::21e:4fff:fec8:43fc/64 scope link
 valid_lft forever preferred_lft forever

如果你只想看到简单的网络接口列表,你可以用 grep 限制它的输出。

$ ip a | grep inet
 inet 127.0.0.1/8 scope host lo
 inet6 ::1/128 scope host
 inet 192.168.0.6/24 brd 192.168.0.255 scope global eth0
 inet6 fe80::21e:4fff:fec8:43fc/64 scope link

使用如下面的命令,你可以看到你的默认路由:

$ ip route show
default via 192.168.0.1 dev eth0
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.6

在这个输出中,你可以看到通过 eth0 的默认网关是 192.168.0.1,并且本地网络是相当标准的 192.168.0.0/24

你也可以使用 ip 命令来启用和禁用网络接口。

$ sudo ip link set eth1 up
$ sudo ip link set eth1 down

ethtool 命令

另一个检查网络非常有用的工具是 ethtool。这个命令提供了网络接口上的许多描述性的数据。

$ ethtool eth0
Settings for eth0:
 Supported ports: [ TP ]
 Supported link modes: 10baseT/Half 10baseT/Full
 100baseT/Half 100baseT/Full
 1000baseT/Full
 Supported pause frame use: No
 Supports auto-negotiation: Yes
 Advertised link modes: 10baseT/Half 10baseT/Full
 100baseT/Half 100baseT/Full
 1000baseT/Full
 Advertised pause frame use: No
 Advertised auto-negotiation: Yes
 Speed: 100Mb/s
 Duplex: Full
 Port: Twisted Pair
 PHYAD: 1
 Transceiver: internal
 Auto-negotiation: on
 MDI-X: on (auto)
Cannot get wake-on-lan settings: Operation not permitted
 Current message level: 0x00000007 (7)
 drv probe link
 Link detected: yes

你也可以使用 ethtool 命令来检查以太网驱动程序的设置。

$ ethtool -i eth0
driver: e1000e
version: 3.2.6-k
firmware-version: 1.4-0
expansion-rom-version:
bus-info: 0000:00:19.0
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
supports-priv-flags: no

自动协商的详细信息可以用这样的命令来显示:

$ ethtool -a eth0
Pause parameters for eth0:
Autonegotiate: on
RX: on
TX: on

traceroute 命令

traceroute 命令用于显示路由路径。它通过在一系列数据包中设置数据包头的 TTL(生存时间)字段来捕获数据包所经过的路径,以及数据包从一跳到下一跳需要的时间。traceroute 的输出有助于评估网络连接的健康状况,因为某些路由可能需要花费更长的时间才能到达最终的目的地。

$ sudo traceroute world.std.com
traceroute to world.std.com (192.74.137.5), 30 hops max, 60 byte packets
 1 192.168.0.1 (192.168.0.1) 3.691 ms 3.678 ms 3.665 ms
 2 10.224.64.1 (10.224.64.1) 26.273 ms 27.354 ms 28.574 ms
 3 10.20.0.33 (10.20.0.33) 28.293 ms 30.625 ms 33.959 ms
 4 10.20.0.226 (10.20.0.226) 36.807 ms 37.868 ms 37.857 ms
 5 204.111.0.132 (204.111.0.132) 38.256 ms 39.091 ms 40.429 ms
 6 ash-b1-link.telia.net (80.239.161.69) 41.612 ms 28.214 ms 29.573 ms
 7 xe-1-3-1.er1.iad10.us.zip.zayo.com (64.125.13.157) 30.429 ms 27.915 ms 29.065 ms
 8 ae6.cr1.dca2.us.zip.zayo.com (64.125.20.117) 31.353 ms 32.413 ms 33.821 ms
 9 ae27.cs1.dca2.us.eth.zayo.com (64.125.30.246) 43.474 ms 44.519 ms 46.037 ms
10 ae4.cs1.lga5.us.eth.zayo.com (64.125.29.202) 48.107 ms 48.960 ms 50.024 ms
11 ae8.mpr3.bos2.us.zip.zayo.com (64.125.30.139) 51.626 ms 51.200 ms 39.283 ms
12 64.124.51.229.t495-rtr.towerstream.com (64.124.51.229) 40.233 ms 41.295 ms 39.651 ms
13 69.38.149.18 (69.38.149.18) 44.955 ms 46.210 ms 55.673 ms
14 64.119.137.154 (64.119.137.154) 56.076 ms 56.064 ms 56.052 ms
15 world.std.com (192.74.137.5) 63.440 ms 63.886 ms 63.870 ms

tcptraceroute 命令

tcptraceroute 命令与 traceroute 基本上是一样的,只是它能够绕过最常见的防火墙的过滤。正如该命令的手册页所述,tcptraceroute 发送 TCP SYN 数据包而不是 UDP 或 ICMP ECHO 数据包,所以其不易被阻塞。

tcpdump 命令

tcpdump 命令允许你捕获网络数据包来进一步分析。使用 -D 选项列出可用的网络接口。

$ tcpdump -D
1.eth0 [Up, Running]
2.any (Pseudo-device that captures on all interfaces) [Up, Running]
3.lo [Up, Running, Loopback]
4.nflog (Linux netfilter log (NFLOG) interface)
5.nfqueue (Linux netfilter queue (NFQUEUE) interface)
6.usbmon1 (USB bus number 1)
7.usbmon2 (USB bus number 2)
8.usbmon3 (USB bus number 3)
9.usbmon4 (USB bus number 4)
10.usbmon5 (USB bus number 5)
11.usbmon6 (USB bus number 6)
12.usbmon7 (USB bus number 7)

-v 选项控制你看到的细节程度——越多的 v,越详细,但超过 3 个 v 不会有更多意义。

$ sudo tcpdump -vv host 192.168.0.32
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
20:26:31.321816 IP (tos 0x10, ttl 64, id 22411, offset 0, flags [DF], proto TCP (6), length 184)
 192.168.0.6.ssh > 192.168.0.32.57294: Flags [P.], cksum 0x8221 (incorrect -> 0x0254), seq 3891093411:3891093555, ack 2388988308, win 329, length 144
20:26:31.321984 IP (tos 0x10, ttl 64, id 22412, offset 0, flags [DF], proto TCP (6), length 200)
 192.168.0.6.ssh > 192.168.0.32.57294: Flags [P.], cksum 0x8231 (incorrect -> 0x3db0), seq 144:304, ack 1, win 329, length 160
20:26:31.323791 IP (tos 0x0, ttl 128, id 20259, offset 0, flags [DF], proto TCP (6), length 40)
 192.168.0.32.57294 > 192.168.0.6.ssh: Flags [.], cksum 0x643d (correct), seq 1, ack 304, win 385, length 0
20:26:31.383954 IP (tos 0x10, ttl 64, id 22413, offset 0, flags [DF], proto TCP (6), length 248)
...

当你运行像这样的命令时,会看到非常多的输出。

这个命令捕获来自特定主机和 eth0 上的 11 个数据包。-w 选项标识保存捕获包的文件。在这个示例命令中,我们只要求捕获 11 个数据包。

$ sudo tcpdump -c 11 -i eth0 src 192.168.0.32 -w packets.pcap
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
11 packets captured
11 packets received by filter
0 packets dropped by kernel

arp 命令

arp 命令将 IPv4 地址映射到硬件地址。它所提供的信息也可以在一定程度上用于识别系统,因为网络适配器可以告诉你使用它们的系统的一些信息。下面的第二个 MAC 地址,以 f8:8e:85 开头,很容易被识别出是 Comtrend 路由器。

$ arp -a
? (192.168.0.12) at b0:c0:90:3f:10:15 [ether] on eth0
? (192.168.0.1) at f8:8e:85:35:7f:b9 [ether] on eth0

上面的第一行显示了系统本身的网络适配器的 MAC 地址。该网络适配器似乎已由台湾 Chicony 电子公司制造。你可以很容易地在网上查找 MAC 地址关联,例如来自 Wireshark 的这个工具 —— https://www.wireshark.org/tools/oui-lookup.html


via: https://www.networkworld.com/article/3233306/linux/more-ways-to-examine-network-connections-on-linux.html

作者:Sandra Henry-Stocker 译者:kimii 校对:wxy

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

当你使用命令行的时候,无论什么时候,你都位于一个目录中,它告诉了命令行当前所位于的完整目录。在 Linux 中,你可以使用 rm 命令删除目录,但是首先,你需要使用 mkdir 命令来创建目录。在这篇教程中,我将使用一些易于理解的例子来讲解这个工具的基本用法。

在开始之前,值得一提的是,这篇教程中的所有例子都已经在 Ubuntu 16.04 LTS 中测试过。

Linux mkdir 命令

正如上面所提到的,用户可以使用 mkdir 命令来创建目录。它的语法如下:

mkdir [OPTION]... DIRECTORY...

下面的内容是 man 手册对这个工具的描述:

如果目录还不存在,则创建之。

下面这些 Q&A 式的例子将能够帮助你更好的理解 mkdir 这个命令是如何工作的。

Q1. 如何使用 mkdir 命令创建目录?

创建目录非常简单,你唯一需要做的就是把你想创建的目录的名字跟在 mkdir 命令的后面作为参数。

mkdir [dir-name]

下面是一个简单例子:

mkdir test-dir

Q2. 如何确保当父目录不存在的时候,同时创建父目录?

有时候,我们需要使用一条 mkdir 命令来创建一个完整的目录结构,这时候,你只需要使用 -p 这个命令行选项即可。

比如,你想创建目录 dir1/dir2/dir3,但是,该目录的父目录都不存在,这时候,你可以像下面这样做:

mkdir -p dir1/dir2/dir3

How to make sure parent directories (if non-existent) are created

Q3. 如何在创建目录时自定义权限?

默认情况下,mkdir 命令创建目录时会把权限设置为 rwx, rwx, r-x

How to set permissions for directory being created

但是,如果你想自定义权限,那么你可以使用 -m 这一命令行选项。

mkdir -m command option

Q4. 如何使 mkdir 命令显示操作细节?

如果你希望 mkdir 命令显示它所执行的操作的完整细节,那么你可以使用 -v 这一命令行选项。

mkdir -v [dir]

下面是一个例子:

How to make mkdir emit details of operation

结论

你已经看到,mkdir 是一个非常简单,易于理解和使用的命令。学习这一命令不会遇到任何屏障。在这篇教程中,我们讨论到了它的绝大部分命令行选项。记得练习这些命令,并在日复一日的工作中使用这些命令。如果你想了解关于这一命令的更过内容,请查看它的 man 手册。


via: https://www.howtoforge.com/linux-mkdir-command/

作者:Himanshu Arora 译者:ucasFL 校对:wxy

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

目标

了解特殊权限的工作原理,以及如何识别和设置它们。

要求

难度

简单

约定

  • # - 要求直接以 root 用户或使用 sudo 命令执行指定的命令
  • $ - 用普通的非特权用户来执行指定的命令

介绍

通常,在类 Unix 操作系统上,文件和目录的所有权是基于文件创建者的默认 uid(user-id)和 gid(group-id)的。启动一个进程时也是同样的情况:它以启动它的用户的 uidgid 运行,并具有相应的权限。这种行为可以通过使用特殊的权限进行改变。

setuid 位

当使用 setuid (设置用户 ID)位时,之前描述的行为会有所变化,所以当一个可执行文件启动时,它不会以启动它的用户的权限运行,而是以该文件所有者的权限运行。所以,如果在一个可执行文件上设置了 setuid 位,并且该文件由 root 拥有,当一个普通用户启动它时,它将以 root 权限运行。显然,如果 setuid 位使用不当的话,会带来潜在的安全风险。

使用 setuid 权限的可执行文件的例子是 passwd,我们可以使用该程序更改登录密码。我们可以通过使用 ls 命令来验证:

ls -l /bin/passwd
-rwsr-xr-x. 1 root root 27768 Feb 11 2017 /bin/passwd

如何识别 setuid 位呢?相信您在上面命令的输出已经注意到,setuid 位是用 s 来表示的,代替了可执行位的 x。小写的 s 意味着可执行位已经被设置,否则你会看到一个大写的 S。大写的 S 发生于当设置了 setuidsetgid 位、但没有设置可执行位 x 时。它用于提醒用户这个矛盾的设置:如果可执行位未设置,则 setuidsetgid 位均不起作用。setuid 位对目录没有影响。

setgid 位

setuid 位不同,setgid (设置组 ID)位对文件和目录都有影响。在第一个例子中,具有 setgid 位设置的文件在执行时,不是以启动它的用户所属组的权限运行,而是以拥有该文件的组运行。换句话说,进程的 gid 与文件的 gid 相同。

当在一个目录上使用时,setgid 位与一般的行为不同,它使得在所述目录内创建的文件,不属于创建者所属的组,而是属于父目录所属的组。这个功能通常用于文件共享(目录所属组中的所有用户都可以修改文件)。就像 setuid 一样,setgid 位很容易识别(我们用 test 目录举例):

ls -ld test
drwxrwsr-x. 2 egdoc egdoc 4096 Nov 1 17:25 test

这次 s 出现在组权限的可执行位上。

sticky 位

sticky (粘连)位的工作方式有所不同:它对文件没有影响,但当它在目录上使用时,所述目录中的所有文件只能由其所有者删除或移动。一个典型的例子是 /tmp 目录,通常系统中的所有用户都对这个目录有写权限。所以,设置 sticky 位使用户不能删除其他用户的文件:

$ ls -ld /tmp
drwxrwxrwt. 14 root root 300 Nov 1 16:48 /tmp

在上面的例子中,目录所有者、组和其他用户对该目录具有完全的权限(读、写和执行)。sticky 位在可执行位上用 t 来标识。同样,小写的 t 表示可执行权限 x也被设置了,否则你会看到一个大写字母 T

如何设置特殊权限位

就像普通的权限一样,特殊权限位可以用 chmod 命令设置,使用数字或者 ugo/rwx 格式。在前一种情况下,setuidsetgidsticky 位分别由数值 4、2 和 1 表示。例如,如果我们要在目录上设置 setgid 位,我们可以运行:

$ chmod 2775 test

通过这个命令,我们在目录上设置了 setgid 位(由四个数字中的第一个数字标识),并给它的所有者和该目录所属组的所有用户赋予全部权限,对其他用户赋予读和执行的权限(目录上的执行位意味着用户可以 cd 进入该目录或使用 ls 列出其内容)。

另一种设置特殊权限位的方法是使用 ugo/rwx 语法:

$ chmod g+s test

要将 setuid 位应用于一个文件,我们可以运行:

$ chmod u+s file

要设置 sticky 位,可运行:

$ chmod o+t test

在某些情况下,使用特殊权限会非常有用。但如果使用不当,可能会引入严重的漏洞,因此使用之前请三思。


via: https://linuxconfig.org/how-to-use-special-permissions-the-setuid-setgid-and-sticky-bits

作者:Egidio Docile 译者:jessie-pang 校对:wxy

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

默认的情况下,我们的 ntpd/NTP 服务器会监听所有的端口或者 IP 地址,也就是:0.0.0.0:123。 怎么才可以在一个 Linux 或是 FreeBSD Unix 服务器上,确保只监听特定的 IP 地址,比如 localhost 或者是 192.168.1.1:123

NTP 是 网络时间协议 Network Time Protocol 的首字母简写,这是一个用来同步两台电脑之间时间的协议。ntpd 是一个操作系统守护进程,可以设置并且保证系统的时间与互联网标准时间服务器同步。

NTP 使用 /etc/directory 之下的 ntp.conf 作为配置文件。

/etc/ntp.conf 之中的端口指令

你可以通过设置端口命令来防止 ntpd 监听 0.0.0.0:123,语法如下:

interface listen IPv4|IPv6|all
interface ignore IPv4|IPv6|all
interface drop IPv4|IPv6|all

上面的配置可以使 ntpd 监听那个地址或者不出来任何请求而直接丢弃。ignore 会防止打开匹配的地址,drop 会导致 ntpd 打开该地址并丢弃所有接收到的包,而不做任何检查。举个例子,如果要忽略所有端口之上的监听,加入下面的语句到 /etc/ntp.conf

interface ignore wildcard

如果只监听 127.0.0.1 和 192.168.1.1 则是这样:

interface listen 127.0.0.1
interface listen 192.168.1.1

这是我 FreeBSD 云服务器上的样例 /etc/ntp.conf 文件:

$ egrep -v '^#|$^' /etc/ntp.conf

样例输出为:

tos minclock 3 maxclock 6
pool 0.freebsd.pool.ntp.org iburst
restrict    default limited kod nomodify notrap noquery nopeer
restrict -6 default limited kod nomodify notrap noquery nopeer
restrict    source  limited kod nomodify notrap noquery
restrict 127.0.0.1
restrict -6 ::1
leapfile "/var/db/ntpd.leap-seconds.list"
interface ignore wildcard
interface listen 172.16.3.1
interface listen 10.105.28.1

重启 ntpd

在 FreeBSD Unix 之上重新加载/重启 ntpd:

$ sudo /etc/rc.d/ntpd restart

或者 在 Debian 和 Ubuntu Linux 之上使用下面的命令

$ sudo systemctl restart ntp

或者 在 CentOS/RHEL 7/Fedora Linux 之上使用下面的命令

$ sudo systemctl restart ntpd

校验

使用 netstatss 命令来检查 ntpd 只绑定到了特定的 IP 地址:

$ netstat -tulpn | grep :123

或是:

$ ss -tulpn | grep :123

样例输出:

udp        0      0 10.105.28.1:123         0.0.0.0:*                           -               
udp        0      0 172.16.3.1:123          0.0.0.0:*                           -

在 FreeBSD Unix 服务器上使用 sockstat 命令

$ sudo sockstat
$ sudo sockstat -4
$ sudo sockstat -4 | grep :123

样例输出:

root     ntpd       59914 22 udp4   127.0.0.1:123         *:*
root     ntpd       59914 24 udp4   127.0.1.1:123         *:*

作者是 nixCraft 的创始人并且是一位经验丰富的系统管理员、DevOps 工程师,也是一名 Linux 操作系统和 Unix shell 脚本的训练师。他为全球不同行业,包括 IT、教育业、安全防护、空间研究和非营利性组织的客户工作。关注他的 Twitter, Facebook, Google+


via: https://www.cyberciti.biz/faq/how-to-bind-ntpd-to-specific-ip-addresses-on-linuxunix/

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

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

当你在 ps aux 的输出中看到 sshd:root@notty 时会觉得很奇怪吧,notty 算是哪门子的主机,是不是黑客计算机的名字啊。不过不用担心;notty 仅仅是表示 没有 tty 而已。

当你在本地登录 Linux 机器时,登录终端会在进程列表中显示为 tty( 比如,tty7)。若你通过 ssh 登录一台远程服务器,则会看到类似 root@pts/0 这样的东西。

而若某个连接是由 sftp 或者是由 scp 拷贝文件而创建的,则该连接会会显示成没有 tty (notty)。

如果你仍然想知道服务器上发生了什么事情,可以检查 ps auxf 的输出来查看进程树,或者运行 netstat -vatn 来检查所有的 TCP 连接。


via: http://www.sysadminworld.com/2011/ps-aux-shows-sshd-rootnotty/

作者:sysadminworld 译者:lujun9972 校对:wxy

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

如何在 Linux 或类 Unix 操作系统上的 bash shell 中打开或关闭文件名称颜色(ls 命令颜色)?

大多数现代 Linux 发行版和 Unix 系统都有一个定义了文件名称颜色的别名。然后,ls 命令负责在屏幕上显示文件、目录和其他文件系统对象的颜色。

默认情况下,文件类型不会用颜色区分。你需要在 Linux 上将 --color 选项传递给 ls 命令。如果你正在使用基于 OS X 或 BSD 的系统,请将 -G 选项传递给 ls 命令。打开或关闭颜色的语法如下。

如何关闭 ls 命令的颜色

输入以下命令:

$ ls --color=none

或者用 unalias 命令删除别名:

$ unalias ls

请注意,下面的 bash shell 别名被定义为用 ls 命令显示颜色。这个组合使用 alias 命令grep 命令

$ alias | grep ls

示例输出:

alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'

如何打开 ls 命令的颜色

使用以下任何一个命令:

$ ls --color=auto
$ ls --color=tty

如果你想要的话,可以定义 bash shell 别名

alias ls='ls --color=auto'

你可以在 ~/.bash_profile~/.bashrc 文件 中添加或删除 ls 别名 。使用文本编辑器(如 vi)编辑文件:

$ vi ~/.bashrc

追加下面的代码:

# my ls command aliases #
alias ls = 'ls --color=auto'

在 Vi/Vim 文本编辑器中保存并关闭文件即可

关于 *BSD/macOS/Apple OS X 中 ls 命令的注意点

-G 选项传递给 ls 命令以在 {Free、Net、Open} BSD 或 macOS 和 Apple OS X Unix 操作系统家族上启用彩色输出:

$ ls -G

示例输出:

How to enable colorized output for the ls command in Mac OS X Terminal

如何在 Mac OS X 终端中为 ls 命令启用彩色输出

如何临时跳过 ls 命令彩色输出?

你可以使用以下任何一种语法暂时禁用 bash shell 别名

\ls
/bin/ls
command ls
'ls'

关于作者

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


via: https://www.cyberciti.biz/faq/how-to-turn-on-or-off-colors-in-bash/

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

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