最全FreeSwitch 1.10.9 Linux通用编译部署教程

2023-11-11

FreeSwitch 通用编译部署教程


FreeSwitch的版本历程

2006年-第一个版本
2008年-1.0凤凰版
2012年-Freeswitch 1.2
2014年-FreeSwitch 1.4 WebRTC
2015年-FreeSwitch 1.6 视频通话和视频会议
2017年-FreeSwitch 1.8
2019年-FreeSwitch 1.10
2020年-FreeSwitch 1.10.3
2023年-FreeSwitch 1.10.9

此安装教程自测freeswitch1.10.2与freeswitch1.10.9版本能正常安装,freeswitch1.10.7/freeswitch1.10.8安装情况应该与freeswitch1.10.9相同

1.基础环境

操作系统:
阿里云ECS CentOS Linux release 7.9 (Ubuntu等Linux系统安装一些问题见文末,可参照前面的步骤,基本上大同小异)

cat /proc/version 或者 uname -a命令查看
Linux version 3.10.0-1160.90.1.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) )

2.安装方式

使用源码编译安装

可使用git拉取代码编译安装,也可以使用WinSCP等工具上传源码tar包到服务器再编译安装

3.安装基础依赖

yum install -y git alsa-lib-devel autoconf automake bison broadvoice-devel bzip2 curl-devel libdb4-devel e2fsprogs-devel erlang flite-devel g722_1-devel gcc-c++ gdbm-devel gnutls-devel ilbc2-devel ldns-devel libcodec2-devel libcurl-devel libedit-devel libidn-devel libjpeg-devel libmemcached-devel libogg-devel libsilk-devel libsndfile-devel libtheora-devel libtiff-devel libtool libuuid-devel libvorbis-devel libxml2-devel lua-devel lzo-devel mongo-c-driver-devel ncurses-devel net-snmp-devel openssl-devel opus-devel pcre-devel perl perl-ExtUtils-Embed pkgconfig portaudio-devel postgresql-devel python-devel python-devel soundtouch-devel speex-devel sqlite-devel unbound-devel unixODBC-devel wget which yasm zlib-devel libshout-devel libmpg123-devel lame-devel

4.下载cmake并进行编译安装

wget https://github.com/Kitware/CMake/releases/download/v3.23.0/cmake-3.23.0.tar.gz
tar -zvxf cmake-3.23.0.tar.gz
cd cmake-3.23.0
./bootstrap
make
make install

#链接
sudo ln -sf /usr/local/bin/cmake /usr/bin/cmake
sudo ln -sf /usr/local/bin/cpack /usr/bin/cpack
sudo ln -sf /usr/local/bin/ctest /usr/bin/ctest

5.需要手动安装所需的依赖

autoconf-2.71及以上版本
下载链接:http://mirrors.kernel.org/gnu/autoconf/

cd /usr/local/src
tar xzvf autoconf-2.71.tar.gz
cd autoconf-2.71
./configure  //做相关编译前的环境检查
make
make install

opus-1.3.1及以上版本

yum remove opus
cd /usr/local/src
wget https://archive.mozilla.org/pub/opus/opus-1.3.1.tar.gz
tar xzvf opus-1.3.1.tar.gz
cd opus-1.3.1
./configure  //做相关编译前的环境检查
make
make install
cp /usr/lib/pkgconfig/opus.* /usr/lib64/pkgconfig/

如果没安装opus编译时会报错
You must install libopus-dev to build mod_opus. Stop.
如果手动安装后还是不行参照如下方式进行安装:

cd /etc/yum.repos.d/
touch linuxtech.repo
vi  linuxtech.repo

//linuxtech.repo中添加如下内容:
//按i或者insert键进入编辑模式,按Esc键退出编辑模式,输入:wq!保存退出。

[linuxtech]
name=LinuxTECH
baseurl=http://pkgrepo.linuxtech.net/el6/release/
enabled=1
gpgcheck=1
gpgkey=http://pkgrepo.linuxtech.net/el6/release/RPM-GPG-KEY-LinuxTECH.NET

//最后安装opus:
yum install libopus-devel

6.下载源代码

freeswitch1.10.4及之后的版本freeswitch官方将spandsp 和 sofia-sip单拎出来了,需要单独拉代码编译,如果是编译1.10.4之前的freeswitch(如freeswitch1.10.2版本)不必单独拉spandsp和sofia-sip的代码,直接编译freeswitch即可

重大改动历史:
https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/Release-Notes/FreeSWITCH-1.10.x-Release-notes_25460878/

//可直接在上述链接中下载freeswitch的tar包

1.8 -> 1.10.0: pgqsql moved out from FreeSWITCH core to its own module, mod_pgsql .
See 1.10.0 (Release date: 05 August 2019) at the bottom.
1.10.3 -> 1.10.4: SpanDSP and sofia-sip have been removed.
See 1.10.4 (Release date: 05 Aug 2020)​ below.
1.10.6 -> 1.10.7: Default behaviour change: to not skip announcement type apps on recovery, not hangup call on SRTP errors, 1000 maximum receiving requests per second, auth-messages and auth-subscriptions are enabled by default now, freeswitch.log log line prefix modified: will affect fail2ban log line matching until similarly modified in fail2ban (https://github.com/fail2ban/fail2ban/issues/3143).
See 1.10.7 (Release date: 24 Oct 2021)​ below.
//如果安装freeswitch1.10.2等版本可以不用拉spandsp和sofia-sip的代码,直接在官网链接下载tar包导入服务器即可解压编译

cd /usr/local/src
git clone -b v1.10.9 https://github.com/signalwire/freeswitch

cd /usr/local/src/freeswitch
git clone https://github.com/freeswitch/spandsp.git
git clone https://github.com/freeswitch/sofia-sip.git
//编译spandsp
cd /usr/local/src/freeswitch/spandsp
./bootstrap.sh
./configure
make
make install
//编译sofia-sip
cd /usr/local/src/freeswitch/sofia-sip
./bootstrap.sh
./configure
make
make install
//添加库的路径到系统
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:${PKG_CONFIG_PATH} 
ldconfig

编译freeswitch前将不必要的模块编译禁用掉,如果不禁用则需要安装对应的依赖,否则会报错

cd /usr/local/src/freeswitch
vim module.conf

//将mod_signalwire和mod_av内容注释掉

#applications/mod_signalwire
#applications/mod_av

//mod_verto不禁用可能会编译报错You need to either install libks or disable mod_verto in modules.conf

#endpoints/mod_verto  
//编译freeswitch
cd /usr/local/src/freeswitch
./bootstrap.sh  //如果是GitHub拉的代码有这一步,如果是下载tar包解压的没有这一步
./configure --enable-portable-binary --prefix=/usr/local/freeswitch --with-gnu-ld --with-python --with-openssl --enable-core-odbc-support --enable-zrtp
make
make install

如果编译时还是提示spandsp之类的未安装,返回对应文件夹make install一下spandsp并:

export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:${PKG_CONFIG_PATH} 
ldconfig

再回去make clean一下,随后配置./configure,然后再重新尝试make

7.编译freeswitch1.10.9问题处理

安装好前面的依赖后,编译freeswitch1.10.9时应该没有报依赖的错误(如果有请检查是否有漏掉的步骤,或者百度解决,再次编译前记得make clean后重新./configure),但是报了spandsp相关内容编译的错误error: ‘V18_MODE_5BIT_4545’ undeclared:

making all mod_spandsp
make[4]: Entering directory `/usr/local/src/freeswitch-1.10.9.-release/src/mod/applications/mod_spandsp'
  CC       mod_spandsp_la-mod_spandsp.lo
  CC       mod_spandsp_la-udptl.lo
  CC       mod_spandsp_la-mod_spandsp_fax.lo
  CC       mod_spandsp_la-mod_spandsp_dsp.lo
mod_spandsp_dsp.c: In function ‘get_v18_mode’:
mod_spandsp_dsp.c:159:10: error: ‘V18_MODE_5BIT_4545’ undeclared (first use in this function)
  int r = V18_MODE_5BIT_4545;
          ^
mod_spandsp_dsp.c:159:10: note: each undeclared identifier is reported only once for each function it appears in
mod_spandsp_dsp.c:165:8: error: ‘V18_MODE_5BIT_50’ undeclared (first use in this function)
    r = V18_MODE_5BIT_50;
        ^
mod_spandsp_dsp.c: In function ‘spandsp_tdd_send_session’:
mod_spandsp_dsp.c:216:2: error: too few arguments to function ‘v18_init’
  tdd_state = v18_init(NULL, TRUE, get_v18_mode(session), V18_AUTOMODING_GLOBAL, put_text_msg, NULL);
  ^
In file included from /usr/local/include/spandsp.h:111:0,
                 from mod_spandsp.h:50,
                 from mod_spandsp_dsp.c:36:
/usr/local/include/spandsp/v18.h:138:29: note: declared here
 SPAN_DECLARE(v18_state_t *) v18_init(v18_state_t *s,
                             ^
mod_spandsp_dsp.c: In function ‘spandsp_tdd_encode_session’:
mod_spandsp_dsp.c:263:2: error: too few arguments to function ‘v18_init’
  pvt->tdd_state = v18_init(NULL, TRUE, get_v18_mode(session), V18_AUTOMODING_GLOBAL, put_text_msg, NULL);
  ^
In file included from /usr/local/include/spandsp.h:111:0,
                 from mod_spandsp.h:50,
                 from mod_spandsp_dsp.c:36:
/usr/local/include/spandsp/v18.h:138:29: note: declared here
 SPAN_DECLARE(v18_state_t *) v18_init(v18_state_t *s,
                             ^
mod_spandsp_dsp.c: In function ‘spandsp_tdd_decode_session’:
mod_spandsp_dsp.c:341:2: error: too few arguments to function ‘v18_init’
  pvt->tdd_state = v18_init(NULL, FALSE, get_v18_mode(session), V18_AUTOMODING_GLOBAL, put_text_msg, pvt);
  ^
In file included from /usr/local/include/spandsp.h:111:0,
                 from mod_spandsp.h:50,
                 from mod_spandsp_dsp.c:36:
/usr/local/include/spandsp/v18.h:138:29: note: declared here
 SPAN_DECLARE(v18_state_t *) v18_init(v18_state_t *s,
                             ^
make[4]: *** [mod_spandsp_la-mod_spandsp_dsp.lo] Error 1
make[4]: Leaving directory `/usr/local/src/freeswitch-1.10.9.-release/src/mod/applications/mod_spandsp'
make[3]: *** [mod_spandsp-all] Error 1
make[3]: Leaving directory `/usr/local/src/freeswitch-1.10.9.-release/src/mod'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory `/usr/local/src/freeswitch-1.10.9.-release/src'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/usr/local/src/freeswitch-1.10.9.-release'
make: *** [all] Error 2
[root@maomaosPC freeswitch-1.10.9.-release]# 

将源代码放到Source Insight工程中搜索相关关键词检查发现是spandsp中的内容导致的编译错误,freeswitch相关部分的代码和spandsp模块代码不匹配,去GitHub上查看提交记录,刚好是23年6月底提交的,离我编译就隔了几天的时间,真是个倒霉蛋哦。言归正传,这时候考虑回退spandsp的代码到之前代码匹配的版本,然后重新编译就可以编译成功。
具体步骤:

//先切到对应目录下删除相关内容
cd /usr/local/src/freeswitch
rm -rf spandsp
//重新拉取代码
git clone https://github.com/freeswitch/spandsp.git
//spandsp目录下执行git log或者gitlab上查看对应commit id并切换
git checkout -b finecode20230705 0d2e6ac65e0e8f53d652665a743015a88bf048d4
//按照之前的步骤重新编译安装
//在Github上反馈了这个问题后, 维护人员2023/07/19回复:
mod_spandsp uses the defines you change, e.g. V18_MODE_5BIT_4545 from v18.h,
so it is broken now as it hasn't been updated.It needs to be updated with new defines.

freeswitch安装完成后,为了让freeswitch在任何一个目录都可以运行,我们可以配置软连接:

ln -sf /usr/local/freeswitch/bin/freeswitch /usr/local/bin/
ln -sf /usr/local/freeswitch/bin/fs_cli /usr/local/bin/
//freeswitch默认安装路径/usr/local/freeswitch

8.常见配置文件说明

文件 说明
vars.xml 一些常用变量
dialplan/default.xml 缺省的拨号计划
directory/default/*.xml SIP用户,每用户一个文件
sip_profiles/internal.xml 一个SIP
sip_profiles/externa.xml 另一个SIP-UA,用作外部连接,端口5080
autoload_configs/modules.conf.xml 配置当FreeSWITCH启动时自动装载哪些模块

修改默认端口:
cd /usr/local/freeswitch/conf
(freeswitch1.10.9在/usr/local/freeswitch/etc/freeswitch目录下)
找到vars.xml修改:(可以copy一份存为vars.xml.bak备份)
修改默认端口
<X-PRE-PROCESS cmd="set" data="internal_sip_port=5060"/>
5060默认为freswitch 的sip信令内部端口

9.防火墙配置

1、在var.xml中修改
<!--X-PRE-PROCESS cmd="stun-set" data="external_rtp_ip=stun:stun.freeswitch.org"/--> 这里没有使用stun功能,而是直接把公网ip填在这里
<X-PRE-PROCESS cmd="stun-set" data="external_rtp_ip="阿里云分配的公网ip"/>
(freeswitch1.10.9好像如果是默认的端口不用配置这个也能正常使用,修改xml文件后无法访问需要设置stun再reloadxml)

在var.xml中修改了之后,就无需在conf/sip_profiles/internal.xml 和 external.xml中修改了,网上有很多例子都是直接在这两个文件改其实不用,var中改好了之后,这两个文件直接引用external_rtp_ip这个变量即可。

2、配置阿里云的防火墙及操作系统防火墙。具体参考:
https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/Networking/Firewall_1048908/

注:
阿里云点击:实例->安全组->配置规则,即可开始配置防火墙规则
另外,如果云服务器还安装了宝塔这里的工具,也需要在宝塔面板中对防火墙进行设置才能让freeswitch正常工作

防火墙配置完成后应该就可以了,使用设备注册上服务器拨打下回音电话9196试试能不能听到回音。

FreeSwitch常用默认号码:
号码 说明
9664 保持音乐
9191 注册CluCon
9192 调用info在log中显示Channel信息
9195 echo, 回音测试,延迟5秒
9196 echo,回音测试
9197 milliwatte extention, 铃音生成
9198 TGML铃音生成示例
9180 铃音测试,使用远端生成的回铃音
9181 铃音测试,产生英式铃音
9182 铃音测试,使用音乐当铃音,彩铃
9183 先应答,然后发送英式铃音
9184 先应答,然后发送音乐铃音
9178 收传真
9179 发传真
5000 IVR实例
4000 听取主意信箱
33xx 电话会议,48Hz(其中xx为00~99,下同)
32xx 电话会议,32Hz(其中xx为00~99,下同)
31xx 电话会议,16Hz(其中xx为00~99,下同)
30xx 电话会议,8Hz(其中xx为00~99,下同)
2000-2002 呼叫组
1000-1019 默认分机号码(默认密码1234)

FreeSwitch默认号码大部分是拨号计划的名称,具体定义在conf/diaplan/default.xml中

10.账号密码配置/添加新用户

修改默认密码:vars.xml
<X-PRE-PROCESS cmd="set" data="default_password=1234"/>

freeswitch批量添加用户
参考:https://blog.51cto.com/u_15049794/3833216
(freeswitch1.10.9在/usr/local/freeswitch/etc/freeswitch目录下寻找)
在/usr/local/freeswitch/conf/directory/default 下有1000.xml~1019.xml 这20个默认用户的配置文件

创建用户的xml后,要加载这些新用户的xml,需要修改/usr/local/freeswitch/conf/dialplan/default.xml这个文件里的拨号规则(正则表达式):

<extension name="Local_Extension">
<!-- 这里可以修改正则范围,允许所有分机号-->
<!--默认为  <condition field="destination_number" expression="^(10[01][0-9])$">   -->
<condition field="destination_number" expression="^([0-9]\d+)$">
<!-- ... -->
<action application="set" data="call_timeout=120"/>
<!-- ... -->
</condition>
</extension>

主要是改下正则表达式,允许所有数字。另外,默认还有一个N秒不接认为超时的配置,默认是30秒,如果有需要调整的,也可以一并修改。
调整/usr/local/freeswitch/conf/dialplan/public.xml

<extension name="public_extensions">
   <!-- 允许所有分机号 -->
   <condition field="destination_number" expression="^([0-9]\d+)$">
       <action application="transfer" data="$1 XML default"/>
   </condition>
</extension>

批量生成用户xml文件:

import org.apache.commons.lang3.StringUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class CreateFreeswitchUser {

    public static void main(String[] args) throws IOException {
        String template = "D:\\soft\\FreeSWITCH\\conf\\directory\\default\\";
        String templateContent = read(template + "1000.xml");
        //创建99个用户
        for (int i = 1; i < 100; i++) {
            String newUser = "1" + StringUtils.leftPad(i + "", 3, '0');
            String newContent = templateContent.replaceAll("1000", newUser);
            String newFileName = template + newUser + ".xml";
            write(newFileName, newContent);
            System.out.println(newFileName + " done!");
        }
    }

    static String read(String fileName) throws IOException {
        File f = new File(fileName);
        if (!f.exists()) {
            return null;
        }
        FileInputStream fs = new FileInputStream(f);
        String result = null;
        byte[] b = new byte[fs.available()];
        fs.read(b);
        fs.close();
        result = new String(b);
        return result;
    }

    static void write(String fileName, String fileContent) throws IOException {
        File f = new File(fileName);
        if (f.exists()) {
            f.delete();
        }
        FileOutputStream fs = new FileOutputStream(f);
        fs.write(fileContent.getBytes());
        fs.flush();
        fs.close();
    }
}

然后将生成的用户文件拷贝到/usr/local/freeswitch/conf/directory/default目录下

11.freeswitch后台基础操作指令

ps -ef | grep freeswithch 查看进程号
netstat -an | grep 5060 查询FreeSWITCH 监听在哪个IP地址上(默认5060端口的情况下)
whereis freeswitch 查看freeswitch安装路径


freeswitch -help可查看帮助信息
freeswitch  启动并前台运行
freeswitch -nc  启动并后台运行
freeswitch -stop 停止

fs_cli 进入freeswitch控制台后:
show registrations 查看注册用户情况
sofia status profile internal reg 显示在线注册用户信息
status 查看freeswitch的运行状态
/exit 或 /quit 或 /bye  退出fs_cli
shutdown 关闭freeswitch
reloadxml 重新加载xml配置
console loglevel 7 开启控制台日志级别, 0-7, 数字越大日志越多
version 显示版本信息

12.相关tar包下载

如果网络不好拉不下来GitHub上的代码,可以下载下面的tar包编译试一下:(0积分,绝不给CSDN打一点工)包含:autoconf-2.71、cmake-3.23.0、opus-1.3.1、sofia-sip、spandsp、freeswitch-1.10.2.-release、freeswitch-1.10.9.-release
链接:
https://download.csdn.net/download/qq_36369267/88003573

13.VoIP客户端工具推荐:

推荐portsip-uc和linphone,Android和Windows均有安装包,portsip在IOS上应该也是有客户端的,可自行搜索下载使用

14.Ubuntu问题:

步骤与CentOS基本一致,具体步骤参考一下下面这篇博文:
https://blog.csdn.net/qq_40170041/article/details/123996904

编译部署可能遇到的问题:

#报错1
configure: error: no usable libodbc; please install unixodbc devel package or equivalent
#处理
sudo apt-get install unixodbc
或./configure时不带参数(unixodbc安装后没用时采用此方式)
#报错2:
src/switch_apr.c:81:23: fatal error: uuid/uuid.h: No such file or directory
#处理
sudo apt-get install uuid-dev

15.参考:

References:
https://www.cnblogs.com/kn-zheng/p/17388340.html
https://blog.51cto.com/lion3875/599416
http://www.360doc.com/content/15/0401/19/15077656_459884519.shtml

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

最全FreeSwitch 1.10.9 Linux通用编译部署教程 的相关文章

  • 在 execl 在输出中不可见之前打印

    include
  • 无法在 Linux 的 NetBeans 中编译 C++ 和 OpenGL (GLFW) 的简单源代码

    我开始学习 OpenGL glfw 我从教程中复制源代码并尝试编译它 但出现了错误 我想我已经正确安装了所有头文件 glm glfw 等 这是我的来源 我没有在头文件中使用这些字符 include iostream include stdi
  • 如果文件没有行尾字符,则 wc -l 不计算文件的最后一个

    我需要计算 unix 文件的所有行数 该文件有 3 行 但是wc l仅给出 2 个计数 我知道它不计算最后一行 因为它没有行尾字符 任何人都可以告诉我如何计算这一行吗 grep c返回匹配行的数量 只需使用一个空字符串 作为您的匹配表达式
  • 找出Linux上一个进程使用了​​多少内存页

    我需要找出进程分配了多少内存页 每个页面是 4096 进程内存使用情况我在查找正确值时遇到一些问题 当我查看 gome system monitor 时 内存映射下有几个值可供选择 Thanks 这样做的目的是将内存使用量除以页数并验证页大
  • 我们如何在使用循环时调用 ansible playbook 中的变量

    我有两个文件 其中这些文件包含server names and server IP s 我想更改 替换一些特定的server names and IP addressees根据要求在两个文件中 这与这篇文章 因为它被要求开设一个新职位 ht
  • 如何通过 makefile 在 Linux 上安装程序? [复制]

    这个问题在这里已经有答案了 可能的重复 Linux Unix make install 应该包含什么 https stackoverflow com questions 528399 what should linux unix make
  • Linux 内核使用的设备树文件 (dtb) 可视化工具? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个可以图形化表示Linux内核中使用的硬件设备树的工具 我正在尝试了解特定 Arm 芯片组
  • 任何退出 bash 脚本但不退出终端的方法

    当我使用exitshell 脚本中的命令 该脚本将终止终端 提示符 有什么方法可以终止脚本然后停留在终端中吗 我的剧本run sh预计通过直接获取或从另一个脚本获取来执行 编辑 更具体地说 有两个脚本run2 sh as run sh ec
  • bash 将输出重定向到文件,但结果不完整

    重定向命令输出的问题已经被问过很多次了 但是我有一个奇怪的行为 我使用的是 bash shell debian 版本 4 3 30 1 release 并尝试将输出重定向到文件 但并非所有内容都记录在文件中 我尝试运行的 bin 文件是 l
  • 更新Linux中的包含路径

    我的 my path to file 文件夹中有几个头文件 我知道如何将这些文件包含在新的 C 程序中 但每次我都需要在包含它之前输入头文件的完整路径 我可以在linux中设置一些路径变量 以便它自动查找头文件吗 您可以创建一个 makef
  • BASH:输入期间按 Ctrl+C 会中断当前终端

    我的 Bash 版本是 GNU bash version 4 3 11 1 release x86 64 pc linux gnu 我有一段这样的代码 while true do echo n Set password read s pas
  • 在 x86 汇编语言中获取文件大小的简单方法

    假设我已经在汇编中打开了一个文件 并且在寄存器 eax 中有该文件的文件句柄 我将如何获取文件的大小 以便为其分配足够的缓冲区空间 我在这里研究了另一个讨论 建议使用sys fstat 28 系统调用来获取文件统计信息但无法实现它 My a
  • 如何并行执行4个shell脚本,我不能使用GNU并行?

    我有4个shell脚本dog sh bird sh cow sh和fox sh 每个文件使用 xargs 并行执行 4 个 wget 来派生一个单独的进程 现在我希望这些脚本本身能够并行执行 由于某些我不知道的可移植性原因 我无法使用 GN
  • 来自守护程序的错误响应:加入会话密钥环:创建会话密钥:超出磁盘配额

    我尝试在我的服务器上安装 docker 使用本教程 https docs docker com install linux docker ce ubuntu 我想远程运行 docker 镜像并使用 portainer Web 界面来管理一切
  • Ubuntu Python shebang 线不工作

    无法让 shebang 线在 Ubuntu 中为 python 脚本工作 我每次只收到命令未找到错误 test py usr bin env python print Ran which python usr bin python 在 sh
  • grep 排除文件的数组参数

    我想从我的文件中排除一些文件grep命令 为此我使用参数 exclude excluded file ext 为了更容易阅读 我想使用包含排除文件的 bash 数组 EXCLUDED FILES excluded file ext 然后将
  • 在 docker 中重定向命令输出

    我想为我的服务器做一些简单的日志记录 它是一个在 Docker 容器中运行的小型 Flask 应用程序 这是 Dockerfile Dockerfile FROM dreen flask MAINTAINER dreen WORKDIR s
  • vmsplice() 和 TCP

    在原来的vmsplice 执行 有人建议 http lwn net Articles 181169 如果您的用户态缓冲区是管道中可容纳的最大页面数的 2 倍 则缓冲区后半部分成功的 vmsplice 将保证内核使用缓冲区的前半部分完成 但事
  • 执行命令而不将其保留在历史记录中[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在进行软件开发时 经常需要在命令行命令中包含机密信息 典型示例是将项目部署到服务器的凭据设置为环境变量 当我不想将某些命令存储在命令历史记
  • 如何使用 JSch 将多行命令输出存储到变量中

    所以 我有一段很好的代码 我很难理解 它允许我向我的服务器发送命令 并获得一行响应 该代码有效 但我想从服务器返回多行 主要类是 JSch jSch new JSch MyUserInfo ui new MyUserInfo String

随机推荐

  • QT基本使用

    目录 一 QWidget QDialog QMainWIndow的异同点 二 信号与槽 1 信号与槽 2 自动关联信号与槽 3 自定义信号与槽 设定槽 设定信号 四 模态 非模态窗口 1 新窗口的创建 2 模态 非模态窗口的创建 五 加载资
  • 程序员求职之道(《程序员面试笔试宝典》)之面试笔试技巧?

    不是看了本C语言编程书籍 就可以说精通C语言 会写一句hello world 就可以自称程序员 程序员是一种职业 更是一种精神 他们天资聪颖 不拘小节 他们个性十足 幽默风趣 他们工作努力 任劳任怨 他们是21世纪最可爱的人 选择程序员作为
  • 需求着急上线,是写烂代码的理由吗?

    软件开发大师Martin Fowler说过 Any fool can write code that a computer can understand Good programmers write code that humans can
  • C++学习笔记(三)--继承中的异常处理

    继承中的异常处理 include
  • Docker部署seata Nacos作为注册配置中心

    Docker部署seata Nacos作为注册配置中心 一 Seata服务端安装 一 Seata clint使用 一 Seata服务端安装 1 1 要注意和spring cloud boot alibaba等版本对应上 避免出现版本不兼容问
  • 开源项目:ZXing(三)二维码解码

    继续上一节的内容 本节我们将对上一节的QQ群号二维码进行解码 QQ群号二维码图片另存为后 将下载的 jpg拷贝到项目assets目录下 1 解码配置 Map
  • JavaWeb——Servlet(全网最详细教程包括Servlet源码分析)

    JavaWeb Servlet Tomcat工作机制动画演示 点击动图可全屏观看 什么是Servlet Servlet Server Applet 全称Java Servlet 未有中文译文 是用Java编写的服务器端程序 其主要功能在于交
  • netbeans6.0 javafx 插件安装

    netbeans6 0 beta1已经发布有一段时间了 netbeans现在确实是越来越好了 随着新版本的发布 我们也应该来熟悉一下这个好产品 javafx自从2007javaone sun公布以来 一直收到热捧 今天我们来看看netbea
  • Platt SMO算法

    Platt SMO算法 1996年 John Platt 发布了一个称为SMO的强大算法 用于训练SVM SMO表示序列最小优化 SequentialMinimal Optimization Platt 的 SMO 算法是将大优化问题分解为
  • 涂抹CANVAS,判断清除完毕执行操作

    涂抹CANVAS 判断清除完毕执行操作 clearCanvas js代码如下 如清除时断续将 for var i 0 i lt Math round Math PI r i 5 改为 for var i 0 i lt Math round
  • 2021美赛D题

    2021年ICM问题D 音乐的影响 音乐自古以来就是人类社会的一部分 是文化遗产的重要组成部分 为了理解音乐在人类集体经验中所扮演的角色 我们被要求开发一种量化音乐进化的方法 当艺术家创作一首新的音乐作品时 有许多因素会影响他们 包括他们与
  • miscellany-在idea里创建properties文件

    在idea里创建properties文件 在resources里创建即可
  • C++this指针

    C this指针 this是C 中的一个关键字 也是一个const指针 它指向当前对象 通过它可以访问当前对象的所有成员 例如 class A private char name public void show cout lt lt he
  • ubuntu22.04安装YouCompleteMe

    先建一个文件夹 sudo mkdir vim bundle 然后进入这个文件夹 hunter hunter desktop vim bundle ls command t sparkup vim fugitive Vundle vim 接下
  • Qt入门超级简单小项目(3)布局管理器

    环境 Windows10 Qt5 完善菜单 1 新建Qt Widgets应用 项目名称为myMainWindow1 基类选择QMainWindow 类名为MainWindow 2 完成后 在设计模式添加菜单项 并添加资源文件 向其中添加菜单
  • sharding-jdbc 实现按月分表

    最近生产上发现了一个大表 因为数据太多导致新增查询都很慢 考虑先对历史数据进行归档 新数据按月分表存储 使用到的框架主要是 sharding jdbc spring boot mybatis durid 先建个demo简单实践下 首先 准备
  • wsl Hyper-V 与 安卓模拟器虚拟机同时共存方案

    最新消息 雷电9 0版本 已经支持共存了 不必搞那么麻烦了 WSL 在开发者手里是必不可少的 仿真服务器开发模式 安卓虚拟机 有时调试起来更加方便 但可惜的是 市面上的安装模拟器 都不支持与wsl友好共存 要么是版本低 要么是卡到要死 既然
  • 日志定期压缩、清除

    1 背景 定位问题 打印日志的一个目的是为了快速定位线上问题 日志打印的越详细 问题原因就越容易定位 磁盘空间有限 随着业务量提升 磁盘空间满了 日志将无法打印了 为了平衡上面两个条件 我们可以压缩文件和保留一定时间 如7天 的历史文件 2
  • SFM(Structure from Motion)一点总结

    SFM Structure from Motion 一点总结 运动结构恢复 Structure from motion 数十年来一直是计算机视觉领域的热门研究方向之一 实现了众多实际应用 尤其在近景三维重建中 该算法从获取的目标物系列影像出
  • 最全FreeSwitch 1.10.9 Linux通用编译部署教程

    FreeSwitch 通用编译部署教程 文章目录 FreeSwitch 通用编译部署教程 FreeSwitch的版本历程 1 基础环境 2 安装方式 3 安装基础依赖 4 下载cmake并进行编译安装 5 需要手动安装所需的依赖 6 下载源