- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
背景/问题
由于我绝对不能更改安全性配置,因此我必须将一个联合用户myuser
放到所有盒子上。
我需要部署到的设备上的所有东西都由deployuser
拥有,我绝对不能更改此设置。myuser
可以假定用户为deployuser
并具有所有sudo特权。
最终,我希望Capistrano部署能够像从一开始就以deployuser
ssh的方式运行一样,因此每个命令都以deployuser
和/home/deployuser
的身份运行。
我可以使用任何想要的Capistrano版本,但现在我正在尝试使用Capistrano 3。
测试设置
我创建了一个简单的Capistrano任务,以测试是否可以对deployuser
拥有的文件执行操作。
desc "Check that we can access everything"
task :check_permissions do
on roles(:all) do |host|
execute("whoami")
execute("cp /tmp/file-owned-by-deploy-user /tmp/test-file")
end
end
execute('command')
的内容时,它会覆盖任何表示“以X用户身份执行此操作”的配置。更好的测试是只运行
cap environment deploy
任务,看看失败了。
deploy.rb
中,甚至在我的任务定义之上,以防万一:
require 'sshkit/backends/netssh_global'
SSHKit::Backend::NetsshGlobal.configure do |config|
config.owner = 'deployuser'
config.directory = '/home/deployuser'
end
:ssh_backend
,这在
this issue for sshkit-backends-netssh_global中可以看到:
require 'sshkit/backends/netssh_global'
set :sshkit_backend, -> {
SSHKit::Backend::NetsshGlobal.tap do |backend|
backend.configure do |config|
config.owner = 'deployuser'
config.directory = '/home/deployuser'
end
end
}
sshkit-backends-netssh_global
与Capistrano的最新版本不再兼容。它使用了不推荐使用的方法
checkout
。太讨厌了:
NoMethodError: undefined method `checkout' for #<SSHKit::Backend::ConnectionPool:0x007fae8340e3c0>
whoami
以
deployuser
的身份运行,而cp命令仍然返回Permission Denied。
sudo -u deployuser
来运行。
execute('command')
有点不同,并且不考虑您的配置-它只是执行事情。我认为。因此,这可能仍适用于其他类型的任务(尽管内部Capistrano任务当然不行)。
desc "Check that we can access everything"
task :check_permissions do
on roles(:all) do
as 'deployuser' do
# this returns deployuser
execute("whoami")
# this throws permission denied
execute("cp /tmp/file-owned-by-deploy-user /tmp/test-file")
end
end
end
SSHKit.config.command_map = Hash.new do |hash, command|
hash[command] = "sudo -u deployuser #{command}"
end
whoami
返回
deployuser
,但是
cp
命令仍然返回Permission Denied。同样,这可能是因为
execute
实际上不是我在这里需要测试的。
sudo -u deployuser
附加到命令中,但并非所有命令都正确。我本来在这里还有其他几个人,但我只能将其归类为
chmod
,不能将其作为
deployuser
运行
SSHKit.config.command_map = Hash.new do |hash, command|
skipped_commands = [:chmod]
if skipped_commands.include?(command)
hash[command] = command
else
hash[command] = "sudo -u deployuser #{command}"
end
end
>>
。
# MONKEY PATCH OH NO
# =======================
# you actually have to clear the old rake task
# for yours to overwrite Capistrano's
Rake::Task['deploy:set_current_revision'].clear
desc "IT'S MINE"
task :set_current_revision do
on release_roles(:all) do
within release_path do
execute :echo, "\"$(sudo -u deployuser git rev-parse HEAD)\" | sudo -u deployuser tee REVISION"
end
end
end
Rake::Task['deploy:log_revision'].clear
desc "Log details of the depl
task :log_revision do
on release_roles(:all) do
within releases_path do
execute :echo, %Q{"#{revision_log_message}" | sudo -u deployuser tee #{revision_log}}
end
end
end
end
cap test_environment deploy
。
Gems included by the bundle:
* activesupport (4.2.10)
* airbrussh (1.3.0)
* aws-partitions (1.56.0)
* aws-sdk-core (3.14.0)
* aws-sdk-ec2 (1.25.0)
* aws-sigv4 (1.0.2)
* bundler (1.16.0)
* capistrano (3.10.1)
* capistrano-bundler (1.3.0)
* capistrano-rails (1.3.1)
* coderay (1.1.2)
* concurrent-ruby (1.0.5)
* dogapi (1.28.0)
* faraday (0.14.0)
* i18n (0.9.3)
* jmespath (1.3.1)
* json (1.8.6)
* method_source (0.9.0)
* minitest (5.11.1)
* multi_json (1.13.1)
* multipart-post (2.0.0)
* net-scp (1.2.1)
* net-ssh (4.2.0)
* pry (0.11.3)
* rake (12.3.0)
* slackbot (0.0.2)
* sshkit (1.15.1)
* sshkit-backends-netssh_global (0.1.1)
* thread_safe (0.3.6)
* tzinfo (1.2.4)
最佳答案
我不是capistrano用户,但是您可以使用OpenSSH功能来实现此目的。假设:
myuser
authorized_keys
文件)myuser
都有一个.ssh / authorized_keys文件,其中包含capistrano用于认证的公钥。您可以在该行上添加一条指令,该指令在使用该密钥时强制ssh服务器运行硬编码命令,而不是远程客户端请求的命令。这使您可以为请求的命令插入自己的处理程序。
#!/bin/sh
sudo -u deployuser $SSH_ORIGINAL_COMMAND
SSH_ORIGINAL_COMMAND
环境变量设置为远程客户端请求的命令字符串。
ssh-rsa AAAAB3NzaC1yc2EAA...
command=/home/myuser/run-as-deployuser ssh-rsa AAAAB3NzaC1yc2EAA...
关于ruby-on-rails - 如何以myuser ssh身份,但在/home/deployuser中以deployuser身份运行所有Capistrano命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48411406/
我正在使用SQL Server 2008 R2,并且想创建一个触发器。 对于每个添加(仅添加),将像这样更新一列: ABC-CurrentYear-AutoIncrementCode 例子: ABC-
是否可以在显示最终一致性的数据存储中创建/存储用户帐户? 似乎不可能在没有一堆架构复杂性的情况下管理帐户创建,以避免可能发生具有相同 UID(例如电子邮件地址)的两个帐户的情况? 最终一致性存储的用户
您好, 我有一个带有 Identity 的 .NetCore MVC APP并使用 this指导我能够创建自定义用户验证器。 public class UserDomainValidator : IU
这与以下问题相同:HiLo or identity? 我们以本站的数据库为例。 假设该站点具有以下表格: 帖子。 投票。 注释。 使用它的最佳策略是什么: 身份 - 这是更常见的。 或者 HiLo -
我想将 Blazor Server 与 ASP.NET Identity 一起使用。但我需要使用 PostgreSQL 作为用户/角色存储,因为它在 AWS 中。 它不使用 EF,这是我需要的。 我创
我正在开发一个 .NET 应用程序,它可以使用 Graph API 代表用户发送电子邮件。 提示用户对应用程序进行授权;然后使用获取的访问 token 来调用 Graph API。刷新 token 用
我使用 ASP.NET 身份和 ClaimsIdentity 来验证我的用户。当用户通过身份验证时,属性 User.Identity 包含一个 ClaimsIdentity 实例。 但是,在登录请求期
所以我在两台机器上都安装了 CYGWIN。 如果我这样做,它会起作用: ssh -i desktop_rsa root@remoteserver 这需要我输入密码 ssh root@remoteser
我尝试在 mac osx 上的终端中通过 telnet 连接到 TOR 并请求新身份,但它不起作用,我总是收到此错误消息: Trying 127.0.0.1... telnet: connect to
我正在开发一个 .NET 应用程序,它可以使用 Graph API 代表用户发送电子邮件。 提示用户对应用程序进行授权;然后使用获取的访问 token 来调用 Graph API。刷新 token 用
我正在开发一项服务,客户可以在其中注册他们的 webhook URL,我将发送有关已注册 URL 的更新。为了安全起见,我想让客户端(接收方)识别是我(服务器)向他们发送请求。 Facebook和 G
在 Haskell 中,有没有办法测试两个 IORef 是否相同?我正在寻找这样的东西: IORef a -> IORef a -> IO Bool 例如,如果您想可视化由 IORef 组成的图形,这
我是 .NET、MVC 和身份框架的新手。我注意到身份框架允许通过注释保护单个 Controller 操作。 [Authorize] public ActionResult Edit(int? Id)
我有一列具有身份的列,其计数为19546542,我想在删除所有数据后将其重置。我需要类似ms sql中的'dbcc checkident'这样的内容,但在Oracle中 最佳答案 在Oracle 12
这是我用来创建 session 以发送电子邮件的代码: props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enabl
我想了解 [AllowAnonymous] 标签的工作原理。 我有以下方法 [HttpGet] public ActionResult Add() { return View(); } 当我没
在使用沙盒测试环境时,PayPal 身份 token 对某些人显示而不对其他人显示的原因是否有任何原因。 我在英国使用 API,终生无法生成或找到 token 。 我已经遵循协议(protocol)并
我对非常简单的事情有一些疑问:IDENTITY。我尝试在 phpMyAdmin 中创建表: CREATE TABLE IF NOT EXISTS typEventu ( typEventu
习语 #1 和 #5 是 FinnAPL Idiom Library两者具有相同的名称:“Progressive index of (without replacement)”: ((⍴X)⍴⍋⍋X⍳
当我第一次在 TFS 中设置时,我的公司拼错了我的用户名。此后他们将其更改为正确的拼写,但该更改显然未反射(reflect)在 TFS 中。当我尝试 checkin 更改时,出现此错误: 有没有一种方
我是一名优秀的程序员,十分优秀!