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
/etc/asterisk/res_odbc.conf
[asterisk-connector]
enabled => yes
dsn => asterisk-connector
username => MyUsername
password => MyPassword
pooling => no
limit =>
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拨号方案中执行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中获取用户名/密码,但问题是原因。我会继续调查:)
EDIT2:
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
答案 0 :(得分:0)
我会替换"用户名"使用" UID "和#34;密码"与" PWD "在你的odbc.ini ....来自FreeTDS Manual - Chapter 4 - Preparing ODBC:
这个难题的原始ODBC解决方案使用了odbc.ini文件。 odbc.ini存储有关服务器的信息,通常称为数据源名称(DSN)。通过调用函数SQLConnect(DSN,UID,PWD)连接到服务器的ODBC应用程序,其中DSN是odbc.ini中的数据源名称条目,UID是用户名,PWD是密码。有关DSN的任何和所有信息都保存在odbc.ini中。一切都是对的。
ODBC 3.0规范引入了一个新功能:SQLDriverConnect。连接属性作为单个参数提供,这是一串连接的名称 - 值对。 SQLDriverConnect包含SQLConnect的功能,因为名称 - 值对字符串允许调用者传递 - 另外还有原始DSN,UID和PWD - 驱动程序可以接受的任何其他参数。此外,应用程序可以指定使用哪个驱动程序。实际上,可以将整个DSN属性集指定为SQLDriverConnect的参数,从而避免了对odbc.ini的需求。这导致使用了所谓的无DSN配置,没有odbc.ini的设置。
答案 1 :(得分:0)
好的,所以我解决了它(差不多)。我的odbc文件中的密码和用户名被忽略了。因为我从Asterisk调用数据库查询,所以我也使用了一个名为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
[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 = 1
pre-connect = yes
请记住,如果您使用Centos 64位来修改lib64的驱动程序路径。大多数在线指南都有错误的(64位)路径。
祝你好运 - 这很令人头痛:)
答案 2 :(得分:0)
我联系了unixODBC的开发人员Nick Gorham关于这个问题,他确认 isql没有从配置文件中读取用户名/密码
嗨尼克,
我认为unixODBC是一个伟大的项目,但我很惊讶地看到它 是不安全的(至少我不知道如何正确使用它。)
当我使用isql连接到数据库时,我必须输入 密码。在共享服务器上,这是不安全的,因为
$ ps -aux
命令以明文形式显示密码。
有没有解决方法?我可以将密码放在可读的文件中吗? 只有我的用户?
感谢您的帮助。
答案:
您好,
这取决于司机。有些人可以从中读取用户和密码 odbc.ini或〜/ .odbc.ini文件,以便您可以在那里存储密码。
isql仅设计为一个简单的测试应用程序,没有任何停止 你修改ilsq从文件中提取用户和密码 您的选择,如果需要可以解密。
答案 3 :(得分:0)
我遇到了一个稍微不同的问题,但我的谷歌搜索将我带到了这里。尝试通过 isql 连接时,即使我在 odbc.ini 文件中指定了一个用户,我也收到了 Login failed for user ''
[SQLSERVER_SAMPLE]
Driver=ODBC Driver 17 for SQL Server
Server=SERVER
Database=DATABASE
Trusted_Connection=no
UID=USER
PWD=PASSWORD
我尝试了 UID
和 User
,但都出现了相同的错误。阅读 @Andrei Sura 的解决方案后,我发现用户名和密码被忽略了。
我的解决方案是运行 isql -v SQLSERVER_SAMPLE USER PASSWORD
,即使在 odbc.ini 文件中指定了用户名和密码 - 并且它已连接。