Linux下ODBC的安装配置

unixODBC的安装与配置

在Linux平台下如果需要使用ODBC连接数据库,则需要先安装unixODBC,然后再安装相应的数据库的ODBC驱动。 有些系统如果自带了UnixODBC,则无需安装(执行odbcinst –version 命令检测是否已经安装)。 在此文中我将一步步带你在Linux环境中安装和配置unixODBC。

安装包下载

官网地址http://www.unixodbc.org

建议下载2.3.11版本,因为在UTS中使用该版本配置ODBC连接数据已经得到过验证。

下载地址:http://www.unixodbc.org/unixODBC-2.3.11.tar.gz

编译安装

  • 1.下载安装包
[root@k8s-node6 ~]# cd /home/software/
[root@k8s-node6 software]# wget http://www.unixodbc.org/unixODBC-2.3.11.tar.gz

执行完毕后,下载好的安装包就在/home/software/了。

  • 2.解压文件
[root@k8s-node6 software]# tar -xzvf unixODBC-2.3.11.tar.gz
  • 3.编译安装
[root@k8s-node6 software]# cd unixODBC-2.3.11/

# 配置unixODBC的安装路径为/usr/local/unixODBC
[root@k8s-node6 unixODBC-2.3.11]# ./configure --prefix=/usr/local/unixODBC --sysconfdir=/etc

[root@k8s-node6 unixODBC-2.3.11]# make 

[root@k8s-node6 unixODBC-2.3.11]# make install

至此,unixODBC的编译安装工作就完成了

  • 4.配置环境变量

配置环境变量的方式由很多种,比如直接编辑/etc/profile文件,不过本人更喜欢采用下列方式,在/etc/profile.d/目录下创建.sh文件。 这样做的好处就是进入到这个目录后就可以非常直观的知道哪些环境变量和哪些应用有关。

[root@k8s-node6 unixODBC-2.3.11]# touch /etc/profile.d/unixOdbc.sh 

unixOdbc.sh文件内容如下:

export ODBCDM_HOME=/usr/local/unixODBC
export PATH=$ODBCDM_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ODBCDM_HOME/lib:$LD_LIBRARY_PATH

执行source /etc/profile 使配置的环境变量生效。

[root@k8s-node6 unixODBC-2.3.11]# source /etc/profile 
  • 5.验证unixODBC安装配置是否成功
[root@k8s-node6 unixODBC-2.3.11]# odbcinst --version
unixODBC 2.3.11

能够正确的输出unixODBC 的版本号,说明安装配置成功了。

unixODBC的常用命令

  • 打印出配置好的ODBC数据源
odbcinst -q -s -l
  • isql 验证ODBC数据源配置是否正确
isql -v MyOracle19C utswriter 

用法:isql 数据源名称 [用户名] [密码]

有的数据源在配置ODBC数据源的时候就已经配置好了用户名和密码,所以在执行isql的时候可能就不需要加用户名和密码。

参数 -v,可以详细的打印出连接数据库的日志信息,对于排查问题时很有帮助。

unixODBC的配置文件

unixODBC有两个配置文件,按照上述安装步骤安装后,配置文件所在的路径是/etc目录下:

  • odbc.ini : ODBC数据源的配置文件

  • odbcinst.ini : ODBC的驱动配置文件

Oracle客户端安装和ODBC配置

上文中已经详细的介绍了unixODBC的安装与配置,在Linux环境中安装好unixODBC后,就可以开始安装oracle的ODBC驱动了, 在下文中我将详细的介绍如何在Linux环境中安装Oracle的odbc驱动和配置Oracle的ODBC数据源。 在此文中,我们安装的是Instance Client 21.6版本,如需安装其他版本,也可以参照此文中的步骤。

安装包下载:

官网地址:https://www.oracle.com/cn/database/technologies/instant-client/downloads.html

安装oracle的odbc驱动,需要下载上面两个安装包,一个是instanctclient-basic,一个是instanctclient-odbc。下载时要注意下载相同的版本。

下载链接:

instantclient-basic下载地址https://download.oracle.com/otn_software/linux/instantclient/216000/instantclient-basic-linux.x64-21.6.0.0.0dbru.zip

instanctclient-odbc下载地址:https://download.oracle.com/otn_software/linux/instantclient/216000/instantclient-odbc-linux.x64-21.6.0.0.0dbru.zip

安装Oracle Instance Client

Oracle的客户端安装非常简单,只需要解压,并配置相关的环境变量即可。

将下载好的安装包(2个.zip安装包)都上传到Linux服务器的/home/software 目录下:

  • 1、下载解压文件
#1.下载安装包
[root@k8s-node6 software]# wget https://download.oracle.com/otn_software/linux/instantclient/216000/instantclient-basic-linux.x64-21.6.0.0.0dbru.zip

[root@k8s-node6 software]# wget https://download.oracle.com/otn_software/linux/instantclient/216000/instantclient-odbc-linux.x64-21.6.0.0.0dbru.zip

#2.解压安装包
[root@k8s-node6 software]# unzip instantclient-basic-linux.x64-21.6.0.0.0dbru.zip

[root@k8s-node6 software]# unzip instantclient-odbc-linux.x64-21.6.0.0.0dbru.zip 

解压完后,在/home/software/目录下就会有一个新的目录instantclient_21_6, oracle的客户端和ODBC的相关动态库都在里面。

  • 2、安装和配置Oracle的ODBC驱动 进入到oracle的InstanceClient目录,其中有一个odbc_update_ini.sh的脚本, 这个脚本的作用就是用于创建Oracle的ODBC数据源和驱动配置。
[root@k8s-node6 uts2022]# cd /home/software/instantclient_21_6/

# 如果odbc.ini文件和odbcinst.ini文件在/etc目录下,请执行如下命名:
[root@k8s-node6 instantclient_21_6]# ./odbc_update_ini.sh / /home/software/instantclient_21_6 Oracle19C MyOracle19C /etc/odbc.ini

# 如果odbc.ini文件和odbcinst.ini文件在/usr/local/unixODBC/etc目录下,请执行如下命名:
[root@k8s-node6 instantclient_21_6]# ./odbc_update_ini.sh /usr/local/unixODBC/ /home/software/instantclient_21_6 Oracle19C MyOracle19C /usr/local/unixODBC/etc/odbc.ini

执行完毕后,会在unixODBC的驱动配置文件(/etc/odbcinst.ini)和数据源配置文件(/etc/odbc.ini)文件中添加Oracle的驱动信息。

odbc_update_ini.sh 参数说明:

  • 参数1 / 指的是unixODBC的etc的目录

  • 参数2 /home/software/instantclient_21_6 指的是Oracle的InstanceClient的安装目录

  • 参数3 Oracle19C 指的是驱动名称(在odbcinst.ini文件中会新增一个名为Oracle19C的驱动源)

  • 参数4 MyOracle19C 指的是数据源的名称(在odbc.ini文件中会增加一个MyOracle19C的数据源)

  • 参数5 /etc/odbc.ini 指的是odbc.ini文件的完整路径

  • 3、配置Oracle数据库的tns信息 在/home/software/instantclient_21_6/network/admin 目录下创建tnsnames.ora文件,文件内容如下
# tnsnames.ora Network Configuration File: /opt/oracle/product/19c/dbhome_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.

MyOracle19C =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.60)(PORT = 31524))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = ORCLPDB1)
    )
  )

Tips:

  • MyOracle19C 是配置的TNS的名称
  • 文件中IP地址和端口替换成实际的IP地址和端口,如我的Oracle的服务器IP地址是192.168.0.60,端口31524
  • SERVICE_NAME 是SERVICE_NAME名称,根据实际更改
  • 4、配置环境变量

oarcle的需要配置两个环境变量,一个是ORACLE_HOME,一个是TNS_ADMIN。

另外还需要将Oracle的InstanceClient的库加入系统的动态库搜索路径中。

上面我们在安装unixODBC的时候,在/etc/profile.d/目录中已经创建了一个unixODBC.sh文件, 所以可以直接编辑/etc/profile.d/unixODBC.sh文件,添加环境变量,在unixODBC.sh文件中添加如下内容:

export ORACLE_HOME=/home/software/instantclient_21_6
export TNS_ADMIN=$ORACLE_HOME/network/admin
export LD_LIBRARY_PATH=$ORACLE_HOME:$LD_LIBRARY_PATH

执行source /etc/profile 命令,使得环境变量生效。

[root@k8s-node6 instantclient_21_6]# source /etc/profile
  • 5、验证配置

使用isql命令通过ODBC数据源连接Oracle数据库

语法: isql -v + 数据源名称 + 用户名 + 密码

[root@k8s-node6 instantclient_21_6]# isql -v MyOracle19C user password

如果出现如下所示,则说明所有的配置完全正确。 install

可能遇到的问题

  • 1、libsqlora.so 动态库找不到
[0100][unixODBC][Driver Manager] Can't open lib '/home/software/instantclient_21_6/libsqlora.so.19.1':file not found
[ISQL]Error:Could not SQLConnect

解决方案:

第一步、先检查报错的动态库的路径是否存在, 如果动态库路径存在依然报错,则是因为没有被加入到LD_LIBRARY_PATH环境变量中,此时如环境变量配置所述,配置好LD_LIBRARY_PATH即可。

如果动态库路径配置错误,则编辑/etc/odbcinst.ini 文件,将关于Oracle的驱动的路径的动态库更改为正确路径。

如下图所示:

install

  • 2、TNS:net service name is incorrectly specified
[S1000][unixODBC][Oracle][ODBC][Ora]ORA-12162: TNS:net service name is incorrectly specified

[ISQL]ERROR: Could not SQLConnect

按照上面的步骤执行下来,这个问题是必然会碰到的,因为执行odbc_update_ini.sh命令生成的配置文件会缺失一些配置参数。

解决方案:

编辑/usr/local/unixODBC/etc/odbc.ini文件中配置的MyOracle19C的数据源,增加ServerName的配置值,如下图所示

install

ServerName的值就是TNS(即Oracle客户端中admin/tnsnames.ora文件中配置的值)

  • 3、中文出现乱码

如果在使用ODBC连Oracle时,出现中文乱码情况,则需要设置字符编码的环境变量,解决方法如下:

1、查看Oracle数据库的字符编码设置

install

2、设置环境变量NLS_LANG

编辑/etc/profile.d/unixODBC.sh 文件,添加环境变量,环境变量的值是上面查询出来的结果

export NLS_LANG="SIMPLIFIED CHINESE_CHINA.AL32UTF8"

3、执行source命令,使环境变量生效

source /etc/profile

至此,Linux下使用UnixODBC配置Oracle的ODBC源的安装配置完成,如果在UTS中使用,则还需要额外一些操作步骤,请继续观看下文。

在Uts中使用

按照上面的操作就已经成功的安装配置好了oracle的ODBC数据源, 但是在UTS中配置Oracle的ODBC连接方式或者OCI、OLEDB连接方式时,可能还会遇到问题。

oci_error

出现这种问题可能是因为Linux版的UTS的安装包自带的oracle的oci的库和我们安装的Instance Client客户端有版本不一致导致有冲突, 所以需要做如下操作:

  • 1、停止UTS服务

  • 2、删除UTS安装目录下的Oracle有关的动态库,主要是libclntshcore.so.XX、libclntsh.so.XX、liboramysqlXX.so(这3个动态库在oracle的客户端中都有)

Tips

上面的“XX”表示的是版本号,如libclntshcore.so.19.1 libclntsh.so.19.1 、liboramysql19.so等。

# 进入uts的安装目录
[root@k8s-node6 admin]# cd /home/software/uts2022/

# 删除uts自带的oracle的动态库libclntshcore
[root@k8s-node6 admin]# rm -f libclntshcore.* libclntsh.* liboramysql*
  • 3、查看uts依赖的动态库

第二步中删除了UTS自带的Oracle的动态库后,启动UTS时必定会报缺少XXXX.so,这时我们可以执行如下操作查看UTS缺少的依赖的动态库

# 进入到uts的安装目录

[root@k8s-node6 instantclient_21_6]# cd /home/software/uts2022

# 查看utsdaemon.out依赖的动态库

[root@k8s-node6 uts2022]# ldd utsdaemon.out

就会输出类似于如下内容,重点关注not found 的动态库

    linux-vdso.so.1 =>  (0x00007fff47dfe000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fa1308f7000)
    libwlsysplus9.so => ./libwlsysplus9.so (0x00007fa130678000)
    libwlnetplus9.so => ./libwlnetplus9.so (0x00007fa130459000)
    libwldbplus9.so => ./libwldbplus9.so (0x00007fa130233000)
    libwlsrvplus9.so => ./libwlsrvplus9.so (0x00007fa130024000)
    libutsplus9.so => ./libutsplus9.so (0x00007fa12fe21000)
    libutsdbctrl9.so => ./libutsdbctrl9.so (0x00007fa12fbf9000)
    libutsflctrl9.so => ./libutsflctrl9.so (0x00007fa12f9f4000)
    libutsdbclt9.so => ./libutsdbclt9.so (0x00007fa12f7cb000)
    libutsdbsrv9.so => ./libutsdbsrv9.so (0x00007fa12f5b2000)
    libutsflclt9.so => ./libutsflclt9.so (0x00007fa12f39a000)
    libutsflsrv9.so => ./libutsflsrv9.so (0x00007fa12f18d000)
    libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007fa12ee86000)
    libm.so.6 => /lib64/libm.so.6 (0x00007fa12eb83000)
    libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fa12e96d000)
    libc.so.6 => /lib64/libc.so.6 (0x00007fa12e5ac000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fa130b2a000)
    libmysqlclient.so.18 => ./libmysqlclient.so.18 (0x00007fa12e0ab000)
    libodbc.so.2 => ./libodbc.so.2 (0x00007fa12de39000)
    liboramysql.so => not found
    libz.so.1 => /lib64/libz.so.1 (0x00007fa12dc22000)
    libssl.so.10 => /lib64/libssl.so.10 (0x00007fa12d9af000)
    libcrypto.so.10 => /lib64/libcrypto.so.10 (0x00007fa12d54c000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007fa12d348000)
    libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007fa12d0fb000)
    libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007fa12ce18000)
    libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007fa12cc14000)
    libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007fa12c9e1000)
    libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007fa12c7d2000)
    libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007fa12c5ce000)
    libresolv.so.2 => /lib64/libresolv.so.2 (0x00007fa12c3b3000)
    libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fa12c18e000)
    libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fa12bf2c000)
    liblzma.so.5 => /lib64/liblzma.so.5 (0x00007fa12bd07000)
  • 4、重复上述第3步、查看是否还缺失动态库,如果缺失,则安装相应的依赖库即可。

  • 5、启动UTS服务

MSSQL 客户端安装和ODBC配置

MSSQL的ODBC驱动安装方式由多种,本文讲述的是离线安装方式,在线安装方式(适用于能连外网的机器)可以参考微软的官网。

在线安装方式请参考微软官方文档:https://learn.microsoft.com/zh-cn/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server?view=sql-server-ver16

安装包下载:

以redhat(7)系列为例,官方地址如下:

官网下载地址:https://packages.microsoft.com/rhel/7/prod/

官网地址:https://packages.microsoft.com/rhel/7/prod/msodbcsql17-17.9.1.1-1.x86_64.rpm

Tips

其他操作系统平台,则可以通过微软官网选择相应的安装包(官方网址在上面也已经给出),安装步骤与下文类似。

安装MSSQL的ODBC驱动

  • 1、将下载好的msodbcsql17-17.9.1.1-1.x86_64.rpm上传到/home/software/目录中

  • 2、执行安装

# rpm 进行安装依赖
[root@k8s-node6 software] yum install glibc e2fsprogs krb5-libs openssl unixODBC-devel

# rpm 进行安装ODBC驱动
[root@k8s-node6 software]# rpm -ivh msodbcsql17-17.9.1.1-1.x86_64.rpm

如果机器能连外网,则可以不用下载上传,直接通过执行如下命令安装

# rpm 进行安装依赖
[root@k8s-node6 software] yum install glibc e2fsprogs krb5-libs openssl unixODBC-devel

[root@k8s-node6 software]# rpm -ivh https://packages.microsoft.com/rhel/7/prod/msodbcsql17-17.9.1.1-1.x86_64.rpm
  • 3、安装完毕后,会在unixODBC的odbcinst.ini文件中添加SqlServer的相关驱动信息,如下所示
[ODBC Driver 17 for SQL Server]
Description=Microsoft ODBC Driver 17 for SQL Server
Driver=/opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.7.so.2.1
UsageCount=1

Tips

unixODBC是按照我上文的步骤安装的话odbcinst.ini文件和odbc.ini文件在/etc/目录下

如果是用yum安装的话,配置文件在/etc/目录下

配置SQLSERVER的ODBC数据源

编辑unixODBC目录下的odbc.ini文件,在里面添加类似如下内容

[MSSQL-BASE]
Description=MSSQL BASE
Driver=ODBC Driver 17 for SQL Server
Server=tcp:192.168.0.43,1433

说明:

  • MSQL-BASE:是数据源的名称,可以随便取

  • Description: 描述信息,随便写

  • Driver:驱动名称,填写odbcinst.ini文件中的Sqlserver的驱动名称

  • Server:数据库服务器的ip和地址,语法是:tcp:ip,port

验证

执行如下命令:

[root@k8s-node10 instantclient_19_16]# isql -v MSSQL-BASE 用户名 密码

如果能够正确输出如下,则说明配置正确

+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| echo [string]                         |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> quit

PGSQL ODBC安装与配置

PGSQL官网提供了Linux环境的源码安装包,用户下载后就可以在响应的平台进行编译安装即可。

安装包下载:

官网下载地址如下,选择64位的windows平台的相应版本的ODBC驱动包,如最新的安装包是13.02版本的。

安装PGSQL的ODBC驱动

  • 1、下载安装包
[root@k8s-node10 ~]# cd /home/software

[root@k8s-node10 ~]# wget https://ftp.postgresql.org/pub/odbc/versions/src/psqlodbc-13.02.0000.tar.gz --no-check-certificate 
  • 2、解压安装包
# rpm 进行安装依赖
[root@k8s-node10 software]# tar -xzvf psqlodbc-13.02.0000.tar.gz 


# rpm 进行安装ODBC驱动
[root@k8s-node10 software]# cd psqlodbc-13.02.0000/
[root@k8s-node2 psqlodbc-13.02.0000]#./configure --with-libpq=/usr/pgsql-15 --with-unixodbc=/usr/local/unixODBC --prefix=/usr/local/psqlodbc
[root@k8s-node2 psqlodbc-13.02.0000]# make
[root@k8s-node2 psqlodbc-13.02.0000]# make install

可能会遇到的报错:

configure: error: libpq library version >= 9.2 is required

这是因为还需要安装依赖:postgresql-devel

[root@k8s-node10 psqlodbc-13.02.0000]# yum list | grep postgresql-devel
postgresql-devel.x86_64                  9.2.24-8.el7_9                @updates 
postgresql-devel.i686                    9.2.24-8.el7_9                updates  
soci-postgresql-devel.x86_64             4.0.0-4.el7                   epel     

以CentosOS7 为例(其他系统版本请参考官方网址:https://www.postgresql.org/download/linux/redhat/), 自身自带的postgresql的源的版本比较老(如上述命令执行结果:为9.2版本),如果需要安装新版的ODBC驱动, 则需要安装Postgresql最新的yum源

[root@k8s-node10 psqlodbc-13.02.0000]# sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
[root@k8s-node10 psqlodbc-13.02.0000]# yum install postgresql15-devel

有些服务器如果没有外网,则可以采用离线安装方式(https://download.postgresql.org/pub/repos/yum/15/redhat/rhel-7.7-x86_64/)

# 下载文件
[root@k8s-node10 software]# wget https://download.postgresql.org/pub/repos/yum/15/redhat/rhel-7.7-x86_64/postgresql15-libs-15.0-1PGDG.rhel7.x86_64.rpm  --no-check-certificate  
[root@k8s-node10 software]# wget https://download.postgresql.org/pub/repos/yum/15/redhat/rhel-7.7-x86_64/postgresql15-15.0-1PGDG.rhel7.x86_64.rpm --no-check-certificate  
[root@k8s-node10 software]# wget https://download.postgresql.org/pub/repos/yum/15/redhat/rhel-7.7-x86_64/postgresql15-devel-15.0-1PGDG.rhel7.x86_64.rpm --no-check-certificate  

# 安装(因为以后循环依赖,所以需要写3个包一起安装,不要分开执行)
[root@k8s-node10 software]# rpm -ivh postgresql15-libs-15.0-1PGDG.rhel7.x86_64.rpm postgresql15-15.0-1PGDG.rhel7.x86_64.rpm postgresql15-devel-15.0-1PGDG.rhel7.x86_64.rpm

有些系统比较老,可能会报如下错误:

oci_error

则需要下载libzstd和llvm5的库,下载地址和操作如下:

# 下载
wget https://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/l/libzstd-1.5.2-1.el7.x86_64.rpm --no-check-certificate  
wget https://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/l/llvm5.0-devel-5.0.1-7.el7.x86_64.rpm --no-check-certificate  
wget https://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/l/llvm5.0-5.0.1-7.el7.x86_64.rpm --no-check-certificate  
wget https://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/l/llvm5.0-libs-5.0.1-7.el7.x86_64.rpm --no-check-certificate  

 # 安装
rpm -ivh libzstd-1.5.2-1.el7.x86_64.rpm 
rpm -ivh llvm5*

安装完依赖后再执行第二步操作。

  • 3、安装完毕后,在unixODBC的odbcinst.ini文件中添加Pg的ODBC驱动信息,如下所示
[PostgreSQL]
Description=ODBC for PostgreSQL
Driver=/usr/local/psqlodbc/lib/psqlodbcw.so
Setup=/usr/local/psqlodbc/lib/psqlodbcw.so

Tips

unixODBC是按照我上文的步骤安装的话odbcinst.ini文件和odbc.ini文件在/usr/local/unixODBC/etc/目录下

如果是用yum安装的话,配置文件在/etc/目录下

配置PGSQL的ODBC数据源

编辑unixODBC目录下的odbc.ini文件,在里面添加类似如下内容

[PGSQL-125]
Description=DataSource for PG-125
Driver=Postgresql
Database=xdb
Servername=localhost
Port=5432
UserName=user
Password=password

说明:

  • MSQL-BASE:是数据源的名称,可以随便取

  • Description: 描述信息,随便写

  • Driver:驱动名称,填写odbcinst.ini文件中的Postgresql的驱动名称

  • Servername:数据库服务器的地址,eg:192.168.0.125

  • Port=5432: 数据库端口

  • UserName:数据库的用户名

  • Password:数据库密码

验证

执行如下命令:

[root@k8s-node2 etc]# isql -v PGSQL-125

如果能够正确输出如下,则说明配置正确

+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| echo [string]                         |
| quit                                  |
|                                       |
+---------------------------------------+