Почему ssh перестал работать от crontab, но успешно выполняется при выполнении из командной строки?

Похоже, что T не меньше или больше, чем сопоставим.

Как это исправить?

  1. Либо сделайте T сопоставимым
  2. , либо используйте объект сравнения для сравнения элементов, как стандартные отсортированные контейнеры делают.

, как сделать T меньше и больше чем сопоставимым?

Если, например, вы использовали класс foo как T для создания экземпляра вашего шаблона, то вы должны сделать foo сопоставимым.

Это может быть достигнуто путем определения bool operator<()(const foo&,const foo&), чтобы сделать его менее чем сопоставимым и bool operator>()(const foo&,const foo&), чтобы сделать его более чем сопоставимым. Обратите внимание, что эти функции, вероятно, должны реализовать строгое отношение слабого порядка, чтобы ваш алгоритм работал правильно.

Кроме того, вы можете использовать b < a вместо a > b в своем алгоритме, так что требуется только одно направление сопоставимости.

Это общий двусвязный список, поэтому он должен работать для всех типов данных, верно?

Не все типы сопоставимы. Ваша функция сравнивает объекты этого типа, поэтому нет: ваш шаблон работает не для всех типов данных. Он работает только для тех типов данных, которые сопоставимы.

Если бы вы использовали объект сравнения, то ваш связанный список мог бы также работать для несопоставимых типов, для которых можно написать объект сравнения.

Можете ли вы объяснить мне, как сделать объект сравнения?

Давайте рассмотрим класс foo в качестве примера. Вы можете создать объект сравнения для этого класса, написав класс (назовем его Comp), который перегружает следующий оператор вызова функции:

bool Comp::operator()(const foo&, const foo&) const

Как и в случае сопоставимости foo, эта функция также должен реализовать строгое отношение слабого порядка. Экземпляр такого класса является объектом сравнения. Лямбда может быть достаточно.

Вы должны использовать аргумент шаблона в шаблоне списка, чтобы позволить пользователю шаблона предоставить объект сравнения, который может сравнивать объекты типа T. Сохраните объект как член списка и используйте объект сравнения только для сравнения элементов списка вместо реляционных операторов.

23
задан tkokoszka 15 May 2009 в 16:27
поделиться

1 ответ

Я предполагаю, что обычно, когда вы отправляете ssh с локального компьютера на компьютер, на котором работает crond, ваш закрытый ключ загружается в ssh-agent и пересылается через соединение. Поэтому, когда вы выполняете команду из командной строки, он находит ваш закрытый ключ в ssh-agent и использует его для входа на удаленный компьютер.

Когда crond выполняет команду, он не имеет доступа к ssh-agent, поэтому вы не можете использовать ваш закрытый ключ.

Вам нужно будет создать новый закрытый ключ для пользователя root на машине, на которой запущен crond, и скопировать его открытую часть в соответствующий файл authorized_keys на удаленном компьютере, который вы хотите, чтобы crond вошел в систему.

11
ответ дан 29 November 2019 в 02:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: