Centos 无法使用ISQL连接到MS-SQL

Centos 无法使用ISQL连接到MS-SQL,centos,odbc,isql,Centos,Odbc,Isql,StackExchange上的第一篇帖子-请轻松:) 我在Centos 6中安装了ODBC,以便从我的Asterisk安装中执行ms sql查询 我的配置文件是: /etc/odbc.ini [asterisk-connector] Description = MS SQL connection to 'asterisk' database Driver = /usr/lib64/libtdsodbc.so Setup = /usr/lib64/li

StackExchange上的第一篇帖子-请轻松:)

我在Centos 6中安装了ODBC,以便从我的Asterisk安装中执行ms sql查询

我的配置文件是:

/etc/odbc.ini

[asterisk-connector]
Description     = MS SQL connection to 'asterisk' database
Driver          = /usr/lib64/libtdsodbc.so
Setup           = /usr/lib64/libtdsS.so
Servername      = SQL2
Port            = 1433
Username        = MyUsername
Password        = MyPassword
TDS_Version     = 7.0
/etc/odbcinst.ini

[odbc-test]
Description = TDS connection
Driver = /usr/lib64/libtdsodbc.so
Setup = /usr/lib64/libtdsS.so
UsageCount = 1
FileUsage = 1
[FreeTDS]
Description = TDS connection
Driver = /usr/lib64/libtdsodbc.so
UsageCount = 1

[ODBC]
trace           = Yes
TraceFile       = /tmp/sql.log
ForceTrace      = Yes
/etc/asterisk/res_odbc.conf

[asterisk-connector]
enabled => yes
dsn => asterisk-connector
username => MyUsername
password => MyPassword
pooling => no
limit =>
pre-connect => yes
[asterisk-connector]
enabled = yes
dsn = asterisk-connector
username = MyUsername
password = MyPassword
pooling = no
limit = 1
pre-connect = yes
当我输入密码和用户名时,我可以通过ISQL进行连接:

[root@TestVM etc]# isql -v asterisk-connector MyUsername MyPassword
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL>
..但是我应该能够在没有用户名/密码的情况下连接。结果是:

[root@TestVM etc]# isql -v asterisk-connector
[S1000][unixODBC][FreeTDS][SQL Server]Unable to connect to data source
[01000][unixODBC][FreeTDS][SQL Server]Adaptive Server connection failed
[ISQL]ERROR: Could not SQLConnect
这就好像ISQL无法从配置文件中读取用户名和密码一样

我需要能够从Asterisk dialplan中执行MS-SQL查找,但要实现这一点,我必须能够仅使用数据源名称调用ISQL,并且不能传递身份验证参数

我在网上读到的所有指南都表明,我应该能够只与

isql -v asterisk-connector
命令,但我不会这么做

这件事我已经忙了好几天了,所以如果有人能给我提供帮助或指点,我将不胜感激

提前谢谢

编辑:

我打开了日志记录,可能有线索。用户名和密码肯定没有被传入。看:

[ODBC][27557][1455205133.129690][SQLConnect.c][3614]
                Entry:
                        Connection = 0xac3080
                        Server Name = [asterisk-connector][length = 18 (SQL_NTS)]
                        User Name = [NULL]
                        Authentication = [NULL]
                UNICODE Using encoding ASCII 'ISO8859-1' and UNICODE 'UCS-2LE'

                DIAG [01000] [FreeTDS][SQL Server]Adaptive Server connection failed

                DIAG [S1000] [FreeTDS][SQL Server]Unable to connect to data source
所以这里的用户名和身份验证是[NULL]。它显然没有在odbc.ini或res_odbc.conf中获取用户名/密码,但问题是为什么。我会继续调查:)

编辑2:

OSQL实用程序返回:

[root@TestVM etc]# osql -S SQL2 -U MyUsername -P MyPassword
checking shared odbc libraries linked to isql for default directories...
strings: '': No such file
        trying /tmp/sqlH ... no
        trying /tmp/sqlL ... no
        trying /etc ... OK
checking odbc.ini files
        reading /root/.odbc.ini
[SQL2] not found in /root/.odbc.ini
        reading /etc/odbc.ini
[SQL2] found in /etc/odbc.ini
found this section:
looking for driver for DSN [SQL2] in /etc/odbc.ini
  no driver mentioned for [SQL2] in odbc.ini
looking for driver for DSN [default] in /etc/odbc.ini
osql: error: no driver found for [SQL2] in odbc.ini
我会在odbc.ini中将“Username”替换为“UID”,将“Password”替换为“PWD”。。。。发件人:

解决这个难题的原始ODBC解决方案使用了ODBC.ini文件。odbc.ini存储有关服务器的信息,通常称为数据源名称(DSN)。ODBC应用程序通过调用函数SQLConnect(DSN,UID,PWD)连接到服务器,其中DSN是ODBC.ini中的数据源名称条目,UID是用户名,PWD是密码。有关DSN的所有信息都保存在odbc.ini中。整个世界都很好

ODBC 3.0规范引入了一个新函数:SQLDriverConnect。连接属性是作为单个参数提供的,一个由连接的名称-值对组成的字符串。SqlDriverConnection包含了SQLConnect的功能,因为名称-值对字符串允许调用者传递(除了原始DSN、UID和PWD)驱动程序可以接受的任何其他参数。此外,应用程序可以指定使用哪个驱动程序。实际上,可以将整个DSN属性集指定为SqlDriverConnection的参数,从而无需使用odbc.ini。这导致使用所谓的无DSN配置,即不使用odbc.ini的设置

好的,所以我解决了(差不多)。我的odbc文件中的密码和用户名被忽略。因为我是从Asterisk调用DB查询,所以我也使用了一个名为res_odbc.ini的文件。它还包含我的用户名和密码,当我从Asterisk运行查询时,它会连接并返回正确的结果

如果有帮助,这里是我的最终工作配置

odbc.ini

[asterisk-connector]
Description = MS SQL connection to asterisk database
driver = /usr/lib64/libtdsodbc.so
servername = SQL2
Port = 1433
User = MyUsername
Password = MyPassword
odbcinst.ini

[odbc-test]
Description = TDS connection
Driver = /usr/lib64/libtdsodbc.so
Setup = /usr/lib64/libtdsS.so
UsageCount = 1
FileUsage = 1
[FreeTDS]
Description = TDS connection
Driver = /usr/lib64/libtdsodbc.so
UsageCount = 1

[ODBC]
trace           = Yes
TraceFile       = /tmp/sql.log
ForceTrace      = Yes
freetds.conf

#   $Id: freetds.conf,v 1.12 2007/12/25 06:02:36 jklowden Exp $
#
# This file is installed by FreeTDS if no file by the same
# name is found in the installation directory.
#
# For information about the layout of this file and its settings,
# see the freetds.conf manpage "man freetds.conf".

# Global settings are overridden by those in a database
# server specific section
[global]
        # TDS protocol version
;       tds version = 4.2

        # Whether to write a TDSDUMP file for diagnostic purposes
        # (setting this to /tmp is insecure on a multi-user system)
        dump file = /tmp/freetds.log
;       debug flags = 0xffff

        # Command and connection timeouts
;       timeout = 10
;       connect timeout = 10

        # If you get out-of-memory errors, it may mean that your client
        # is trying to allocate a huge buffer for a TEXT field.
        # Try setting 'text size' to a more reasonable limit
        text size = 64512

# A typical Sybase server
[egServer50]
        host = symachine.domain.com
        port = 5000
        tds version = 5.0

# A typical Microsoft server
[SQL2]
        host = 192.168.1.59
        port = 1433
        tds version = 8.0
res_odbc.conf

[asterisk-connector]
enabled => yes
dsn => asterisk-connector
username => MyUsername
password => MyPassword
pooling => no
limit =>
pre-connect => yes
[asterisk-connector]
enabled = yes
dsn = asterisk-connector
username = MyUsername
password = MyPassword
pooling = no
limit = 1
pre-connect = yes
请记住,如果您正在使用Centos 64位来修改lib64的驱动程序路径。大多数联机指南的路径错误(对于64位)


祝你好运-这是一个令人头痛的问题:)

我就这个问题联系了unixODBC的开发人员Nick Gorham,他确认isql没有从配置文件中读取用户名/密码

你好,尼克

我认为unixODBC是一个伟大的项目,但我很惊讶地看到它 是不安全的(或者至少我不知道如何正确使用它)

当我使用isql连接到数据库时,我必须输入 密码。在共享服务器上,这是不安全的,因为

$ps–辅助

命令以清除方式显示密码

有解决办法吗?我可以把密码放在一个可读的文件中吗 仅由我的用户执行

谢谢你的帮助

答案是:

这取决于司机。有些人可以从数据库中读取用户和密码 odbc.ini或~/.odbc.ini文件,以便您可以在其中存储密码

isql只是设计为一个简单的测试应用程序,没有任何东西可以阻止它 您可以修改ilsq以从的文件中提取用户和密码 你的选择,如果需要解密它


谢谢你,毛罗。我更改了odbc.ini以反映-使用UID和PWD,但在日志中得到相同的错误-用户名和身份验证显示为[NULL]。