Centos 无法使用ISQL连接到MS-SQL
StackExchange上的第一篇帖子-请轻松:) 我在Centos 6中安装了ODBC,以便从我的Asterisk安装中执行ms sql查询 我的配置文件是: /etc/odbc.iniCentos 无法使用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
[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]。