下面的设置:我有一台Linux(Debian)机器作为网络服务器(apache)和Windows上的MS SQL Server。此外,我无法获得SQL用户,只能通过AD / Windows身份验证进行身份验证。
我正在使用Microsoft ODBC驱动程序和我按照Microsoft的说明安装的sqlsrv扩展。
我成功运行了主要名称和密码的kinit
。现在基于Windows-Auth的MSSQL Server连接在使用sqlcmd
时甚至在使用sqlsrv_connect以交互模式(php -a
)使用PHP时都能正常工作,但是当我尝试从php文件到Apache运行一个简单的示例连接时,它并没有'工作。我收到如下错误消息:
Array ( [0] => Array ( [0] => HY000 [SQLSTATE] => HY000 [1] => 851968 [code] => 851968 [2] => [Microsoft][ODBC Driver 17 for SQL Server]SSPI Provider: No Kerberos credentials available (default cache: FILE:/tmp/krb5cc_33) [message] => [Microsoft][ODBC Driver 17 for SQL Server]SSPI Provider: No Kerberos credentials available (default cache: FILE:/tmp/krb5cc_33) ) [1] => Array ( [0] => HY000 [SQLSTATE] => HY000 [1] => 851968 [code] => 851968 [2] => [Microsoft][ODBC Driver 17 for SQL Server]Cannot generate SSPI context [message] => [Microsoft][ODBC Driver 17 for SQL Server]Cannot generate SSPI context ) )
我知道附加的缓存_XX代表UID,所以认为这可能是我已经尝试过不同的用户请求机票和诸如此类的问题,但我无法让它工作。
我也尝试过使用unixODBC并定义一个DSN.It正在使用isql
测试并在php交互模式下使用odbc_connect
(也使用python使用pyodbc),但不是从php页面。
有没有人知道我错过了什么?这可能是非常明显的,但我对这个主题还是比较新的,并且没有太多关于从Linux机器到基于Windows的MS SQL服务器的访问,而没有额外的SQL用户。感谢您的帮助!
我自己找到了答案,本来可以提出这个问题,但我会留下这个以防万一其他人偶然发现这个问题:
我已经认为它与访问权限/权限有关,因为它基本上可以在除Apache之外的任何地方工作,但我无法弄清楚为什么,直到我发现这是由systemd引起的:
Systemd具有阻止服务访问称为SecureTmp的/tmp
的功能。如here所述,为Apache禁用此功能可以解决问题。我现在将看到如何以不同方式执行此操作,因为我不想禁用此功能。希望这对某人有用:-)